Java наследование обобщённых типов

Если создать переменную типа List<Number>, то ей нельзя будет присвоить ссылку на экземпляр ArrayList<Integer>  или ArrayList<Double>. Вы можете присвоить ей только экземпляр ArrayList<Number> ( либо LinkedList<Number> ):

List<Number>  и List<Integer>  — это совершенно разные, несовместимые объекты, несмотря на то что Integer  наследуется от Number.

Однако переменной типа List<?>  можно присвоить как ArrayList<Number>, так и ArrayList<Integer>.

List<?>  является общим предком для List<Number>  и List<Integer>.

Аналогичным образом List<? extends Number>  является предком для List<? extends Integer>:

Также List<? super Integer>  является предком для List<? super Number>:

Это, наверное, трудно так сразу понять и запомнить, но как только вы осознаете это, то это начнёт выглядеть абсолютно логично. На первых порах можете просто выучить, что наследование обобщённых типов работает именно так, вдруг где пригодится.

 

Добавить комментарий

Ваш адрес email не будет опубликован.