Tôi nghĩ phần này của Generics Tutorial giải thích tình huống (sự nhấn mạnh của tôi):
"Bạn cần chắc chắn rằng API chung không bị hạn chế quá mức, nó phải tiếp tục hỗ trợ hợp đồng ban đầu của API. Hãy xem xét lại một số ví dụ từ java.util.Collection. API tiền chung giống như:
interface Collection {
public boolean containsAll(Collection c);
...
}
Một nỗ lực ngây thơ để khái quát nó là:
interface Collection<E> {
public boolean containsAll(Collection<E> c);
...
}
Mặc dù điều này chắc chắn là an toàn, nhưng nó không tuân theo hợp đồng ban đầu của API.
Phương thức chứa All () hoạt động với bất kỳ loại bộ sưu tập nào đến. Nó sẽ chỉ thành công nếu bộ sưu tập đến thực sự chỉ chứa các phiên bản của E, nhưng:
- Kiểu tĩnh của bộ sưu tập đến có thể khác nhau, có lẽ vì người gọi không biết loại chính xác của bộ sưu tập được truyền vào hoặc có thể vì đó là Bộ sưu tập <S>, trong đó S là một kiểu con của E.
- Việc gọi hàm ALL () với một bộ sưu tập thuộc loại khác là hoàn toàn hợp pháp. Các thói quen nên làm việc, trả lại sai. "