2015-11-13 2 views
0

Как объявить список с именем класса в строке. Например, у меня есть переменная className с именем класса. Мне нужно создать List с типом в переменной className.Generics List with string classname

String className ="com.foo.Foo"; 

Можно ли иметь список, который оказывает тот же результат

List<Foo> fooList = new ArrayList<Foo>(); 

, не зная тип во время объявления.

+0

Многостраничный вопрос: * Как объявить список с именем класса в строке *: вы можете посмотреть в загрузчик классов, иначе это не способ сделать это. * Возможно ли иметь список, который имеет тот же результат *: Да, это: просто используйте «Список fooList = new ArrayList();» и приведите результаты при доступе к списку (теперь это всего лишь список (unchecked) Объекты) –

+0

Звучит неправильно. Я могу предположить, что есть метод, использующий отражение, но как вы будете использовать этот список? Как вы будете работать в своем коде с чем-то неизвестного типа? –

+0

Java использует [Тип Erasure] (https://docs.oracle.com/javase/tutorial/java/generics/erasure.html). Во время выполнения типичные типы отсутствуют, поэтому ... почему бы не создать «Список » (что в большинстве случаев означает, что компилятор делает из «Список » в любом случае благодаря типу Erasure)? – Turing85

ответ

2

Это не совсем понятно, но похоже, что вы говорите о создании списка, общий параметр которого определяется во время выполнения, например. это может быть List<Foo> за один проход и List<Bar> во время другого.

Вы не можете этого сделать; проверка типов, включая generics, выполняется во время компиляции. По той же причине вы не можете иметь переменную, тип которой String во время одного прогона и Integer во время другой.

Если вы хотите иметь возможность выбирать разные типы во время выполнения, то параметр общего типа должен быть супертипом всех типов, которые вы можете выбрать. Например, у вас может быть List<Object> и положить в него Foo экземпляров во время одного запуска, а Bar экземпляров во время другого.

+0

Проверка типов во время компиляции не является причиной того, что вы не можете определить генерики во время выполнения (C++ выполняет проверку типов во время компиляции, и там вы можете определить генерики во время выполнения). Фактическая причина - [Тип Erasure] (https://docs.oracle.com/javase/tutorial/java/generics/erasure.html). – Turing85

+1

Это не относится к дженерикам: тип каждой переменной, общий или нет, должен быть известен во время компиляции. Это верно и на C++. (И обратите внимание, что у C++ нет дженериков, у него есть шаблоны, которые используют похожий синтаксис, но работают по-разному.) У вас может быть переменная 'List ', которая может ссылаться либо на «Список », либо «List ' , выбранный во время выполнения, но вы не можете добавлять к нему какие-либо элементы, потому что компилятор не знает, какой тип объектов он требует. – Wyzard

0

Вопрос многоадресной связи «Как объявить список с именем класса в строке»: вы не можете объявить подобным образом. для "Возможно ли иметь список, имеющий тот же результат": вы можете создать что-то вроде "List fooList = new ArrayList();" Но вы должны следить за типом при доступе к fooList.

+0

Вторая часть в качестве примера, приведенного для иллюстрации моего вопроса. Наверное, я должен был быть более яснее.В моем случае я хотел бы объявить список с тем, что есть в переменной имени класса, которая известна только во время выполнения. –