Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятки с генериками и super в частности 
V
    Опции темы
kaa
  Дата 27.11.2011, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 817
Регистрация: 5.11.2005

Репутация: 1
Всего: 2



В общем есть два класса

Код

class MyClass1{}
class MyClass2 extends MyClass1{}


И есть код:

Код

List<? super MyClass2> lst = new LinkedList<MyClass1>();
lst.add( new MyClass1() );


Так вот, Eclipse мне подсвечивает метод add и пишет такую ошибку
Код

The method add(capture#1-of ? super MyClass2) in the type List<capture#1-of ? super MyClass2> is not applicable for the arguments (MyClass1)


Метод add у меня желает принимать только MyClass2 :(

Вопрос: почиму?; где я накосячил?
PM MAIL   Вверх
kaa
Дата 27.11.2011, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 817
Регистрация: 5.11.2005

Репутация: 1
Всего: 2



Нашёл ответ.

http://www.javabeat.net/tips/135-using-sup...cs-java-50.html

Код

? super Dog means, the collection using this syntax can take either collection of same generic type or super generic type.


List<? super Dog> list1 = new ArrayList<Dog>();
List<? super Dog> list2 = new ArrayList<Animal>();
List<? super Dog> list3 = new ArrayList<Object>();

above three line will compile but not below line


List<? super Animal> list4 = new ArrayList<Dog>();

And now let us see what we can add to collection, if we use ? super syntax.

we can add same generic type or sub type of the generic type used in the declaration.

so we can add Animal or Cat or Dog to below collection


List<? super Animal> list = new ArrayList<Animal>();

Now the question is why we are allowed to add values to collection if we use ? super, which is not possible if we use ? extend ????????????.

the reason is, if we use ? super in collection declaration , the reference can point to same generic type of collection or super generic type of collection.

so if we add Animal or subtype of Animal to ? super Animal, the added value(Animal or subtype of it) will pass IS-A test with all types, which are super to Animal.

for example Dog will pass IS-A test with Animal and Object.

below code can explain everything in detail. assume class MyDog extends Dog.


List<? super Dog> list = new ArrayList<Dog>();
list.add(new Dog());
list.add(new MyDog());
list = new ArrayList<Animal>();
list.add(new Dog());
list.add(new MyDog());
list = new ArrayList<Object>();
list.add(new Dog());
list.add(new MyDog());

now how we can iterate this collection using enhanced for loop. 


Если вкратце: super позволяет инициализировать переменную, объявленную с супером, генериками с родительскими типами. которые выше по иерархии наследования, типами; но вот добавлять в саму коллекцию можно только объекты дочерних типов для декларации супер, при этом добавляемый объект автоматом тестируется на IS-A для всех родителей  super-а.

Громоздко как-то получилось... Ну, в статье там всё понятней, это выжимка smile
PM MAIL   Вверх
Sibit
Дата 28.11.2011, 05:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.10.2009
Где: NSK

Репутация: нет
Всего: 1



А зачем может понадобиться такая фича?
PM MAIL   Вверх
kaa
  Дата 29.11.2011, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 817
Регистрация: 5.11.2005

Репутация: 1
Всего: 2



Позволяет передавать типобезопасные коллекции куда-нить + оставляет возможность добавлять в них элементы. Например при использовании ключевого слова extends добавлять в коллекцию уже ничего нельзя - только получать из неё элементы.


Положа руку на сердце: ни разу такой фичей не пользовался. Я просто всё мечтаю SCJP сдать smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0616 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.