Це одна з головних дірок у дженері Java, масиви є коваріантними , тобто масив типів Foo[]
є підкласом Object[]
та ParentOfFoo[]
. Порівнюйте це з тим, у List<Foo>
кого немає такої поведінки.
Це було важливо, коли у Java не було дженериків (до Java 5), оскільки в іншому випадку щось на зразок загальної функції сортування було просто неможливим.
Однак є ця складна проблема, що масиви люблять знати, який тип вони виконують під час виконання . Однак дженерики на Java базуються на стиранні типу. Ці дві речі взагалі не добре поєднуються, і саме тут ми маємо свою проблему.
Тож довгий і короткий його - у Java 1, коваріантні масиви частково заповнювали дірку, яку створив дефіцит генерики. Однак, коли вони намагалися належним чином заповнити цю діру, зворотна сумісність означала, що масиви було неможливо реалізувати.
Насправді хлопець, який насправді створив основу для дженериків, Мартін Одерський, розповів про це тут під час інтерв'ю про те, чому він створив Scala. (Досить захоплююче, якщо вас взагалі цікавить історія Скали)