Являются ли эти две (допустимые) общие границы:
<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);
}
И эта работа работает как по назначению, так и по требованию выше для обоих случаев.
Есть ли разница между этими двумя границами, если да, и что одно лучше, чем другое?