2010-05-12 3 views
1

У меня есть arraylist, который мне нужно указать тип во время выполнения.как указать тип genric во время выполнения

ArrayList<String> alist = new ArrayList<String>(); 

Мне нужно указать тип «String» во время выполнения. Как мне это сделать. Не должно быть статическим.

+1

см. Ответ überSkeet или Darren Gilroy на http://stackoverflow.com/questions/1127923/specifying-generic-collection-type-param-at-runtime-java-reflection –

+0

«Мне нужно указать тип« String » во время выполнения "- в основном вы этого не делаете, вам нужно объяснить, что вы пытаетесь сделать более подробно. –

+0

Я не следую этому вопросу. Вы пытаетесь создать 'ArrayList <>', не зная общий аргумент во время компиляции? На самом деле не имеет смысла использовать статическую типизацию (стирание кажется несущественным, кстати). Если охватывающий экземпляр или метод определяет общий параметр, то это может быть то, что вы хотите. –

ответ

5

Это невозможно из-за type erasure - процесс, при котором компилятор удаляет всю информацию, относящуюся к параметрам типа и аргументам типа в классе или методе.

Он доступен только во время компиляции, чтобы проверить типы.

EDIT: Как обходной путь к вашей проблеме вы можете использовать ArrayList<Object>, это позволит вам добавлять любые типы в ArrayList. В этом случае вы можете проверять типы с использованием instanceof и лить на конкретные типы.

1

Вы имеете в виду, что хотите параметризовать тип, используемый для создания ArrayList?

public <T> List<T> interestingMethod(Class<T> type) { 
    List<T> aList = new ArrayList<T>(); 
    // do something interesting... 
    return aList; 
} 

Передача type аргумента нужен только для вывода типа, и я нахожу эту модель клуджа, но это единственный способ с Java.

Как все остальные укажут, мы не имеем информацию о времени выполнения с дженериками из-за стирания типа.

+0

Что означает этот синтаксис: 'public Список interestingMethod (класс type)'? Я раньше не сталкивался с параметром одиночного типа (первым «»). – Eric

+0

Это потому, что метод является общим, но класс, который он принадлежит, не является общим. В этом случае нам нужно объявить общий тип (и любые ограничения на него, такие как extends или super). – SteveD

1

Параметр generic type не скомпилирован в байт-код, поэтому он не доступен во время выполнения. ArrayList < String> просто ArrayList во время выполнения. . Ближайшая вещь, которую вы можете достичь, заключается в том, чтобы добавлять проверки выполнения вовремя. Например, коллекция класс предоставляет decorator, что делает именно это:

List l = Collections.checkedList(new ArrayList<String>(), String.class); 
l.add("Jave uses erasure"); 
l.add(14); 

Если список был создан просто как ArrayList < String>, два дополнения преуспеет во время выполнения. Тем не менее, с реализацией оболочки, каждое добавление элемента проверяется, поэтому второй вызов вызовет исключение ClassCastException.

Смежные вопросы