これらの 2 つの (有効な) 一般的な境界は次のとおりです。
<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
そして、実装が a だけでなく列挙型であることも要求したいと思います。「標準的な」方法は、交差点の境界によるものです。
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);
}
そして、バウンドは両方のケースで上記で意図され、必要とされているとおりに機能します。
これらの 2 つの境界に違いはありますか?もしそうなら、どちらが「優れている」のでしょうか?