2016-02-18 3 views
0

У меня вопрос Java generic.? super Тип Java Generics

У меня следующая иерархия классов:

Employee is base class 
Manager extends Employee 
Executive extends Manager 

В следующей строке (1) не компилируется:

(1) List<? super Manager> foos1 = new ArrayList<Executive>(); // error 

В строках ниже 2 и 3 компиляция нормально:

(2) List<? super Manager> foos2 = new ArrayList<Manager>(); 
(3) List<? super Manager> foos3 = new ArrayList<Employee>(); 

однако, хотя я все еще могу добавить Исполнителя так:

(4) foos2.add(new Manager("Manager!",123)); 
(5) foos3.add(new Executive("Executive!",1.0,2)); 

Пожалуйста, объясните логику, почему я не могу присвоить переменной

<? super Manager> = ArrayList<Executive> 

где исполнительный супер диспетчера, но я все еще могу добавить Исполнительный объект в список массива?

большое спасибо!

+0

так называемого дубликата (т.е. ПЕСГ) не отвечает на мой вопрос. –

+0

Я думаю, что это так .. но это мое мнение .. Ну, я снова открыл ваш вопрос :) – TheLostMind

+0

http://stackoverflow.com/questions/2723397/java-generics-what-is-pecs –

ответ

3

Executive является суб класс Manager, не суперкласса.

Другие две работы, потому что Employee является суперклассом Менеджера и ограничениями типа являются включительно (т. Е. Сам класс или любой из его суперклассов), поэтому Manager подходит к границам.

+0

Я держу пари, что ОП запутался, потому что это противоположно тому, как иерархия работает в бизнесе. Хотя, конечно, иерархия в его коде - это то, как вещи _should_ быть ... (http://dilbert.com/strip/1994-01-04) – ajb

+0

спасибо! Да, все мое замешательство, чему помогает Java 8 ^) –

5
List<? super Manager> foos1 = new ArrayList<Executive>(); // error 

? super SomeClass
Что это означает, что вы можете создать новый список класса, который является супер-класса SomeClass. Поскольку Executive НЕ является супер-классом Менеджера, вы не можете назначить List<? super Manager> foos1 = new ArrayList<Executive>();

Далее, почему работает foos3.add(new Executive("Executive!",1.0,2));?
Теперь, List<? super Manager> foos3 = new ArrayList<Employee>(); может принимать любые Manager экземпляр. Оказывается Executive это Manager, так что вы можете добавить Executive к List

+0

Большое спасибо! Java-дженерики настолько запутывают меня. –

Смежные вопросы