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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему не даёт получить class аргумента? 
:(
    Опции темы
Dims
Дата 19.12.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Хочу написать абстрактный класс "Метод", который бы реагировал на определённый тип вызова, класс Call. Сваленные в кучу методы можно было бы просматривать, проверять, какой тип вызова данный метод получает -- и вызывать для него run.

Но не даёт.

Код

public class Method<T extends Call> {
   
   public Class<T> getCallClass1() {
      return new Class<T>();
   }
   
   public Class<T> getCallClass2() {
      return T.class;
   }

}


В первом случае ругается на то, что конструктор типа Class является приватным.

Во втором случае ругается на то, что нельзя select from a type variable.

Почему это всё запрещено?
PM MAIL   Вверх
nornad
Дата 19.12.2007, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ну, естественно. Чтобы выдать класс нужен объект этого класса.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Dims
Дата 19.12.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(nornad @  19.12.2007,  21:59 Найти цитируемый пост)
Чтобы выдать класс нужен объект этого класса.

Чтобы выдать класс по объекту, нужно воспользоваться методом getClass(). А поле class позволяет выдать класс не объекта, а класса.

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


Autonomous R&D
**


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

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



Цитата(Dims @  19.12.2007,  20:33 Найти цитируемый пост)
Почему это всё запрещено?

А вы почитайте про generics в Java.
Цитата(Dims @  19.12.2007,  20:33 Найти цитируемый пост)
В первом случае ругается на то, что конструктор типа Class является приватным

Всё правильно. Объект типа Class, для каждого конкретного класса не должен существовать в нескольких экземплярах. Грубо говоря, такой объект имеет особый статический контекст своего существования (Сравнение с синглтоном наверно будет не совсем корректно). Только JVM может создавать такие объекты.
Это конечно не имеет отношения к generics, а вот во втором случае все просто.
Generics в Java - это шаблоны времени компиляции. Что должен сгенерировать компилятор на эту строку:
Код

return T.class;
?
Это станет известно, когда вы в коде подставите вместо параметра шаблона нужный тип. Но класс Method<T extends Call> должен быть скомпилирован и без этих знаний, иначе никакого толку от шаблонов нет. А точнее, в таком случае они могут существовать только в виде исходников, а не скомпилированных классов. Понимаете?

PM MAIL   Вверх
Dims
Дата 20.12.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ivg @  19.12.2007,  23:40 Найти цитируемый пост)
Только JVM может создавать такие объекты.

Ну да. Собственно, первый вариант я показал просто для полноты картины, чтобы было видно, куда я рвусь.

Цитата(ivg @  19.12.2007,  23:40 Найти цитируемый пост)
Это станет известно, когда вы в коде подставите вместо параметра шаблона нужный тип.

Это неочевидно. Почему так? 

PM MAIL   Вверх
serger
Дата 21.12.2007, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

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



Цитата(Dims @ 20.12.2007,  17:59)
Цитата(ivg @  19.12.2007,  23:40 Найти цитируемый пост)
Это станет известно, когда вы в коде подставите вместо параметра шаблона нужный тип.

Это неочевидно. Почему так?

1. Ну потомучто это что-то типа предпроцессора.
2. Это и сделано для контроля типов в момент компиляции.
3. Ну и почитайте всё-таки "generics".


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
Dims
Дата 21.12.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вроде бы читал, но для меня это всё равно не очевидно. Можно поточнее ткнуть меня, где это написано?
PM MAIL   Вверх
LSD
Дата 21.12.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Dims @  21.12.2007,  17:32 Найти цитируемый пост)
Вроде бы читал, но для меня это всё равно не очевидно.

То что ты хочешь требует создание нового класса на каждый параметризованный тип. В .NET именно так и происходит, в Java выбрали другой путь. Т.е. генрики всего лишь берут на себя проверку типов во время компиляции, и все.


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

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

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


 




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


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

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