Я писал что-то с помощью дженериков, и, к моему удивлению, я обнаружил, что это не работает:
class foo<T>{
T innerT = new T();
}
Так что я не могу создать экземпляр обобщенного типа? Нет ли способов сделать это?
Я писал что-то с помощью дженериков, и, к моему удивлению, я обнаружил, что это не работает:
class foo<T>{
T innerT = new T();
}
Так что я не могу создать экземпляр обобщенного типа? Нет ли способов сделать это?
Да, это довольно чертовски раздражает.
Работа, которую я использую, - заставить клиента передать класс при создании нового foo<T>
- i.e.
public foo(Class<T> myClass)
Затем вы можете использовать myClass.newInstance()
.
В среде выполнения JVM не знает, что такое T, поэтому он не может создать новый объект типа T. Типы стираются во время компиляции.
Я всегда предпочитаю шаблон создания (factory, прототип,...). Особенно
public foo(class<T> myClass)
Затем вы можете использовать
myClass.newInstance()
.
является плохим решением, поскольку T не может иметь пустой конструктор.
Это ограничение в способе реализации java java. Чтобы обеспечить совместимость кода с использованием дженериков с унаследованным кодом до дженериков, добавленных в язык, генерические средства были реализованы с использованием стирания типа. Это вызывает много путаницы для людей, которые приходят из langauges, таких как С++, и ожидают, что общий будет работать таким же образом.
Чтобы узнать больше о последствиях этого, это хорошая ссылка
Трюк здесь заключается в том, чтобы "обернуть" конструктор в свой собственный объект, а затем использовать этот объект для создания нужного вам класса.
Если вы не знаете, в каком классе вы участвуете, тогда вы не знаете, есть ли у него конструктор, поэтому вы не можете его называть.
static <T> void myFunction(Provider<T> provider){
T t = provider.get();
}
interface Provider<T>{
public T get();
}
public class MyClass{
}
public static void main(String [] args){
myFunction(new Provider<MyClass>(){
public MyClass get(){
return new MyClass();
}
});
}
Вы можете использовать тип шаблона класса, если вы его подтипируете. См. Мой ответ на другой вопрос - Создание экземпляра типа дженериков в java.