2012-08-30 1 views
5

данный фрагмент кодаПочему добавление подкласса типа a в коллекцию является незаконным?

//Creates a list of List numbers 
    List<List<Number>> num = new ArrayList<List<Number>>(); 
    //Creates a list of List doubles 
    List<List<Double>> doub = new ArrayList<List<Double>>(); 
    //List of doubles 
    List<Double> d = new ArrayList<Double>(); 
    d.add(2.5); 
    d.add(2.6); 
    doub.add(d); 

    num.add(d);//This code will not compile 

Почему это num.add (Doub) не будет разрешен? не является List<List<Number>> a super type List<List<Double>>?

+1

Вы имели в виду num.add (d) вместо num.add (doub)? – Alex

+0

Общие типы должны быть точными, если вы не разрешили '? расширяет подтипы или '? супер' супер type. –

+0

Я отредактировал код. Он имел в виду 'num.add (d)', иначе вопрос не интересен! – romaintaz

ответ

6

Generics inheritance немного отличается от нашего понимания наследования. Если вы хотите использовать типы подкласса, вам нужно определить границы (wildcards), используя либо extends (или) super в generics.

enter image description here

+0

Можете ли вы привести мне пример в отношении моего примера? – KyelJmD

+0

+1 Я добавил изображение к вашему ответу, чтобы быть более ясным –

+0

, так я сделаю это? Список <Список ? – KyelJmD

1

Вы пытаетесь добавить список списков в список, который принимает список. (А не после редактирования я вижу)

Или, может быть немного менее запутанной:

Your num list can only add List<Number>, you are trying to add a List<List<Double>>. 

Кроме того, наследование дженериков не работает таким образом, даже если вы сделали добавить список двойников, он не будет Работа.

Если определить Num так:

List<List<? extends Number>> num = new ArrayList<List<? extends Number>>(); 

Тогда вы будете в состоянии сделать это:

num.add(d); 

но не:

num.add(doub); 
0

List<Double> не имеет ничего делать с List<Number>, поскольку компилятор обеспокоен List<> часть.

Поэтому List<List<Double>> не наследует от List<List<Number>>, они являются двумя совершенно разными типами системы Java Generics. Это не отношение extends, как при создании классов.

0

Учитывая объявленные типы, doub.add(d) и num.add(doub) подразумевают непоследовательное поведение add(). Если doub.add(d) работает, я бы тоже не ожидал num.add(doub).

Возможно, Вы имели в виду, чтобы проверить

num.add(d) 

вместо

num.add(doub) 

?