Đây là một trong những lỗ hổng lớn trong các tổng quát của Java, các mảng là covariant , có nghĩa là một mảng kiểu Foo[]
là một lớp con của Object[]
và ParentOfFoo[]
. Tương phản điều này List<Foo>
mà không có hành vi này.
Điều này rất quan trọng khi Java không có khái quát (cho đến Java 5) bởi vì nếu không, một cái gì đó giống như một hàm sắp xếp chung là không thể.
Tuy nhiên, vấn đề phức tạp này là các mảng muốn biết loại nào trong thời gian chạy . Tuy nhiên, thuốc generic trong Java dựa trên kiểu xóa. Hai điều này hoàn toàn không phù hợp và đó là vấn đề chúng ta gặp phải.
Vì vậy, dài và ngắn của nó là, trong Java 1, các mảng covariant đã lấp đầy một phần lỗ hổng mà thiếu tính tổng quát tạo ra. Tuy nhiên, khi họ cố gắng lấp đầy lỗ hổng này, khả năng tương thích ngược có nghĩa là các mảng khá khó thực hiện.
Trên thực tế, anh chàng thực sự đã tạo ra khuôn khổ cho thuốc generic, Martin Oderky, đã nói về điều này ở đây trong một cuộc phỏng vấn về lý do tại sao anh ta tạo ra Scala. (Khá hấp dẫn nếu bạn quan tâm đến lịch sử của Scala)