我没有任何问题:
我有多个扩展相同界面的枚举:
interface CommonMethods {
// some methods
}
enum E1 implements CommonMethods {
O1, O2;
// interface method impls
}
enum E2 implements CommonMethods {
O3, O4;
// interface method impls
}
我想通过他们共同的继承者来处理这些:Enum和CommonMethods.
到目前为止,我有这样的方法:
static <L extends Enum<?> & CommonMethods> void m(L l) {}
所以我可以通过调用CommonMethods接口中的方法来处理我想要的那些枚举.
现在问题开始了:
但我也希望将其中一些存储在类的静态列表字段中,如下所示:
class Test1 {
static List<Enum<?> & CommonMethods> l = new LinkedList<>();
static {
l.add(E1.O1);
l.add(E2.O3);
}
}
这给了我编译器错误.我有一个解决方案,我觉得很糟糕:
class Test2 {
static List<Enum<?>> l = new LinkedList<>();
static {
l.add(E1.O1);
l.add(E2.O3);
}
static <L extends Enum<?> & CommonMethods> void m(L l) {}
}
这样我就失去了可接受类型的约束.
我该怎么做才能保持约束?
注意:这只是一个虚拟而不是我正在尝试使用的真实代码,所以请不要重构建议.
最佳答案 将类型声明为:
static <L extends Enum<? extends CommonMethods>> void m(L l) {}
在我进行大量研究之前和之后,我已经解决了这个问题,我得出结论,这与类型交集有效.
这个question及其答案讨论了这个话题.