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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Generics 
:(
    Опции темы
Alexey91
Дата 29.9.2013, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте!

Contaiter <Object> obj = new Contaiter <String>();

Почему это вызывает ошибку?
Я понимаю, что так нельзя и так не делаю, но не могу объяснить почему

Contaiter <String> obj = new Contaiter <Obj>();
в этом случае мне понятно, поскольку в коде могут использоваться методы класса String
а у Object этих методов нет, поэтому возникте ошибка...

Почему нельзя в первом случае?

PM   Вверх
Stolzen
Дата 29.9.2013, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Потому что генерики в джаве не ковариантны, т.е. List<Object> не является суперклассом для List<String>.

Добавлено через 7 минут и 7 секунд
Для чего так сделано, можно почитать в Effective Java item 25.

Если вкратце, то массивы ковариантны (String[] является подклассом Object[]) и поэтому можно сделать так:
Код

// Fails at runtime!
Object[] objectArray = new Long[1];
objectArray[0] = "I don't fit in";  // Throws ArrayStoreException


А со списками такое не прокатит:
Код

// Won't compile!
List<Object> ol = new ArrayList<Long>();  // Incompatible types
ol.add("I don't fit in");



--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Samotnik
Дата 29.9.2013, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Давай разберем
Код

Contaiter <Object> obj = new Contaiter <String>();

1. Contaiter <Object> obj в этом случае, Object - это аргумент, определяющий тип, который передается параметру E (или какой ты используешь в Container?). Это значит, что все ссылки, на тип Е будут преобразованы в ссылки на тип Object. Ты можешь посмотреть в IDE, не смотря на ошибку компиляции, если ты напишешь obj.  увидишь, что все методы ожидают Object тип.
2. obj = new Contaiter <String>(); тут obj присваивается ссылка на экземпляр версии String класса. Но это неправильно, т.к. у объекта obj, которому присваивается ссылка, уже определен тип <Object>.

Это зашито в сам компилятор, он требует, что бы ссылка, возвращаемая операцией new, указывала на тот тип, что был объявлен сразу, если это не соблюдается выдается ошибка.

Твое понимание второй ситуации неправильное. Методы то всегда есть, это же не наследование, а настраиваемые типы. Например, всегда будет метод add() только вопрос с чем он будет работать. Во втором случае обоснование такое же, как и для первого.

Итого:
Тип задается сразу и он должен использоваться и после операции new. Это сделано для безопасности, если ты напишешь 
Contaiter <Object> obj = new Contaiter <String>();
То с чем ты будешь работать? 

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.0457 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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