【发布时间】:2013-06-26 04:22:11
【问题描述】:
这两个(有效的)通用边界是:
<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,而且它是一个枚举。 “标准”方式是通过交叉路口:
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);
}
对于这两种情况,绑定的工作方式都符合上述预期和要求。
这两个界限之间是否有区别,如果有,那又是什么,一个比另一个“更好”吗?
【问题讨论】:
-
如果他们真的很理智,我更喜欢交集,因为它不使用通配符,我个人认为它“不干净”