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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как добавить значения в объект, параметризованный "?" 
:(
    Опции темы
Royan
  Дата 13.10.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


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

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



Допустим имеется подобный код
Код

List<? extends Object> list = new ArrayList<String>(); 
list.add("st"); // Ошибка компиляции


Выходит, что объект list в данном случае бесполезен? Или как тогда добавить в него содержание?


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Platon
Дата 13.10.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А я вообще не понимаю смысла данной конструкции.
"? extends Object" подразумевает то, что вы будете общяться с содержимым на уровне интерфейса Object, и следовательно можно просто писать <Object> или в частном случае Object вообще не писать
тут конечно возникнет другая ошибка "Incopatible types", но опять же если мы работаем на уровне Object, зачем нам сужать до String?

Простите пожалуйста, если неправ за выше написанное, и по-моему с generics сильно заигрывать не стоит.
PM MAIL ICQ   Вверх
Royan
Дата 13.10.2007, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


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

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



Platon, Это пример. Место object'а может использоваться любой класс или интерфейс, тогда смысл появляется


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Platon
Дата 13.10.2007, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Нет-нет. в том то и дело, что не появляется с Object равно как и с другими интерфейсами. Я же написал, что на уровне интерфейса Object.
Ну пусть будет на уровне интерфейса MouseListener, и что? все равно get будет возвращать не MyMouseListenerClass, а именно MouseListener (в смысле что работать после get'a тебе придется с ним через интерфейс MouseListener).

Еще раз прошу прощения, что так яростно наступаю, но если я не буду высказывать своего мнения, то так и останусь с неправильными (если они неправильные) взглядами.
PM MAIL ICQ   Вверх
Ornitos
Дата 13.10.2007, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Royan @  13.10.2007,  17:37 Найти цитируемый пост)
Или как тогда добавить в него содержание? 

Никак. Объявление
Код

List<? extends Object> list

говорит о том, что list -- список экземпляров Object или любого подкласса Object. Какие же экземпляры там могут храниться на самом деле точно не известно. На деле list может ссылаться как на List<String>, так и на List<Date> -- ничего не мешает ни тому, ни другому. Если бы ты мог туда что-то положить, то не было бы никакой гарантии, что ты не нарушишь контракт коллекции, не положишь дату к строкам.

Добавлено @ 22:05
Цитата(Platon @  13.10.2007,  20:19 Найти цитируемый пост)
Нет-нет. в том то и дело, что не появляется с Object равно как и с другими интерфейсами. 


Поясню на примере -- сразу будет понятно. Пусть у тебя есть некоторая иерархия классов: базовый класс Music и два наследника Punk и Jazz. 
Код

    class Music {}

    class Punk extends Music {}

    class Jazz extends Music {}


Тебе нужен метод, который может обрабатывать коллекции объектов Music и его наследников. Ты НЕ можешь объявить его так:
Код

void proceed(List<Music> list) { /* some code */  }


Т.к. тогда не скомпилируется
Код

        List<Punk> punks = new LinkedList<Punk>();
        proceed(punks);

        List<Jazz> jazz = new LinkedList<Jazz>();
        proceed(jazz);
 

Объявляешь метод так:
Код

void proceed(List<? extends Music> list) { /* some code */  }


и у тебя всё работает. 

Это сообщение отредактировал(а) Ornitos - 13.10.2007, 22:07
PM MAIL WWW   Вверх
Platon
Дата 13.10.2007, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Хм, тогда и у меня появляется вопрос к Ornitos, мы вернулись к тому, с чего начали.

Цитата(Ornitos @  13.10.2007,  21:50 Найти цитируемый пост)
Объявляешь метод так:
Код

void proceed(List<? extends Music> list) { /* some code */  }

и у тебя всё работает. 


ведь такой код не работает
Код

void process(List<? extends Music>list) {
    list.add(new Punk());
}


Добавлено через 2 минуты и 20 секунд
На самом деле, мне кажется, что тут использование generics неуместно.
PM MAIL ICQ   Вверх
Ornitos
Дата 13.10.2007, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Platon @  13.10.2007,  22:51 Найти цитируемый пост)
ведь такой код не работает

Да, такой код не работает. Но методы, которые анализируют коллекцию, но не добавляют в неё элементы, тоже могут быть полезны.
PM MAIL WWW   Вверх
Platon
Дата 16.10.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вашему вниманию решил представить выход из такой щепетильной ситуации smile

Код

public class Test {
    public static void main(String[] args) {
        List<Music> m = new ArrayList<Music>();
        m.add(new Punk());
        process(m);
        List<Punk> mm = new ArrayList<Punk>();
        mm.add(new Punk());
        process((List<Music>)(Object)mm);
    }

    public static void process(List<Music> m) {
        m.add(null);
    }
}

class Music {

}

class Punk extends Music {

}

PM MAIL ICQ   Вверх
LSD
Дата 16.10.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Platon @  16.10.2007,  15:58 Найти цитируемый пост)
Вашему вниманию решил представить выход из такой щепетильной ситуации

С таким же успехом можно отказаться от генериков и подавить ворнинги.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Royan
Дата 16.10.2007, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


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

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



Platon, По правде говоря плохо понимаю как можно использовать код "выхода из щепетильной ситуации" ...



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

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

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


 




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


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

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