Определить общие аргументы List <> - PullRequest
2 голосов
/ 30 августа 2011

Я использую отражение для обхода членов поля класса, и мне нужно знать для подклассов List <>, каковы параметры универсального типа.

Учитывая поле, которое имеет тип, который являетсяподкласс List, как я могу в общих чертах сказать, что представляют собой параметры типа List <>?

Например:

class X<T> {
   List<String> x1; // String
   ArrayList<String> x2; // String
   SubclassOfArrayListString x3; // String
   List<?> x4; // error
   List<T> x5; // error
}

class SubclassOfArrayListString extends ArrayList<String> {
   // ...
}

ПРИМЕЧАНИЕ. Я добавил <T> к X вышечтобы проиллюстрировать, что могут быть случаи, когда нет правильного ответа - это не имеет ничего общего с проблемой, за исключением того, что нужно учитывать при ответе.

Ответы [ 3 ]

1 голос
/ 30 августа 2011

Вы не можете этого сделать, потому что информация общего типа теряется при компиляции (*) .Это также причина, по которой вы не можете создать массив некоторого универсального типа T во время выполнения.

Во время выполнения каждый List<T> снова является необработанным типом List - вы даже можете добавить Integerдля чего-то, объявленного как List<String>, дженерики не будут и не могут предотвратить это [Правка: использование непроверенных приведений или расширение приведения к необработанному типу;это приведет к (подавляемым) предупреждениям компилятора, но без ошибок].

(*) Редактировать: я узнал некоторые новые и исправленные в определенном виде параметры определенного типа (разработчики GenericDeclaration как Class, Constructor, Field и типы возврата, параметра и исключения Method) будут сохранены в байт-коде и доступны во время выполнения с помощью Field.getGenericType () и аналогичные принадлежности.

0 голосов
/ 30 августа 2011

Прочтите этот учебник о Generics: Обучающий Generics .Это должно прояснить ситуацию.

Этот PDF-файл также имеет хорошие примеры в конце использования подстановочных знаков, а также ключевые слова extends и super. PDF Doc

В основном, используйте Container<? extends A>, если вы хотите читать из контейнера, seИспользуйте Container<? super A>, когда вы хотите записать в контейнер.

0 голосов
/ 30 августа 2011
public class X<T extends List> {
  T field;
}

Это то, что тебе нужно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...