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