Java generics, почему я не могу создать экземпляр обобщенного типа

Я писал что-то с помощью дженериков, и, к моему удивлению, я обнаружил, что это не работает:

class foo<T>{

 T innerT = new T();

}

Так что я не могу создать экземпляр обобщенного типа? Нет ли способов сделать это?

Ответ 1

Да, это довольно чертовски раздражает.

Работа, которую я использую, - заставить клиента передать класс при создании нового foo<T> - i.e.

public foo(Class<T> myClass)

Затем вы можете использовать myClass.newInstance().

Ответ 3

Я всегда предпочитаю шаблон создания (factory, прототип,...). Особенно

public foo(class<T> myClass)

Затем вы можете использовать myClass.newInstance().

является плохим решением, поскольку T не может иметь пустой конструктор.

Ответ 4

Это ограничение в способе реализации java java. Чтобы обеспечить совместимость кода с использованием дженериков с унаследованным кодом до дженериков, добавленных в язык, генерические средства были реализованы с использованием стирания типа. Это вызывает много путаницы для людей, которые приходят из langauges, таких как С++, и ожидают, что общий будет работать таким же образом.

Чтобы узнать больше о последствиях этого, это хорошая ссылка

Ответ 5

Трюк здесь заключается в том, чтобы "обернуть" конструктор в свой собственный объект, а затем использовать этот объект для создания нужного вам класса.

Если вы не знаете, в каком классе вы участвуете, тогда вы не знаете, есть ли у него конструктор, поэтому вы не можете его называть.

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();
        }
    });
}