这两个(有效)通用范围是:
<T extends Enum<T> & MyInterface>
<T extends Enum<? extends MyInterface>>
相同?
假设我有一个界面
interface MyInterface {
void someMethod();
}
和一些实现它的枚举:
enum MyEnumA implements MyInterface {
A, B, C;
public void someMethod() {}
}
enum MyEnumB implements MyInterface {
X, Y, Z;
public void someMethod() {}
}
我想要求实现不仅要使用
MyInterface
,而且还必须是枚举。 “标准”方式是通过交叉点绑定(bind):static class MyIntersectionClass<T extends Enum<T> & MyInterface> {
void use(T t) {}
}
但是我发现这也可行:
static class MyWildcardClass<T extends Enum<? extends MyInterface>> {
void use(T t) {}
}
通过以上操作,可以编译出:
public static void main(String[] args) throws Exception {
MyIntersectionClass<MyEnumA> a = new MyIntersectionClass<MyEnumA>();
a.use(MyEnumA.A);
MyWildcardClass<MyEnumB> b = new MyWildcardClass<MyEnumB>();
b.use(MyEnumB.X);
}
对于这两种情况,绑定(bind)均按上述要求和预期的方式工作。
这两个界限之间是否有区别(如果有的话),并且一个“优于”另一个?
最佳答案
在这种特定情况下,没有区别,因为Enums形式类型参数实际上是自类型。这是因为不能像这样从Enum继承:
class MyEnumA extends Enum<MyEnum2> {}
class MyEnumB implements MyInterface {}
是的,从语义上讲,它们是相同的界限,但这仅是因为它是Enum。