这两个(有效)通用范围是:

<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。

07-24 15:39