Are hai (hợp lệ) giới hạn chung:Có một sự khác biệt giữa các giới hạn chung chung "Enum <T> & Foo" và "Enum <kéo dài Foo?>"
<T extends Enum<T> & MyInterface>
<T extends Enum<? extends MyInterface>>
giống nhau không?
Giả sử tôi có một giao diện
interface MyInterface {
void someMethod();
}
Và một số enums mà thực hiện nó:
enum MyEnumA implements MyInterface {
A, B, C;
public void someMethod() {}
}
enum MyEnumB implements MyInterface {
X, Y, Z;
public void someMethod() {}
}
Và tôi muốn yêu cầu một thực hiện sử dụng không chỉ là một MyInterface
mà còn là nó là một enum. Cách "tiêu chuẩn" là bởi một ngã tư bị ràng buộc:
static class MyIntersectionClass<T extends Enum<T> & MyInterface> {
void use(T t) {}
}
Nhưng tôi đã phát hiện ra rằng điều này cũng hoạt động:
static class MyWildcardClass<T extends Enum<? extends MyInterface>> {
void use(T t) {}
}
Với trên, này biên dịch:
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);
}
Và các ràng buộc hoạt động như và dự định và yêu cầu bởi ở trên cho cả hai trường hợp.
Có sự khác biệt nào giữa hai giới hạn này, nếu có, và là cái nào "tốt hơn" cái kia?
Nếu họ thực sự là lành mạnh, tôi muốn ngã tư vì nó doesn' t sử dụng ký tự đại diện mà cá nhân tôi tìm thấy "ô uế" – Bohemian