Създаване на генеричен тип

Моят код е:

public class MyClass<T extends MyComponent> {
    private T t;
    public MyClass(){
        t = new T();
    }
}

Но компилаторът не приема нов T(). Има ли начин да направите това с помощта на конструктора MyClass(), без параметри?


person ewerton    schedule 26.09.2013    source източник
comment
Посочете T като параметър в конструктора.   -  person qqilihq    schedule 27.09.2013
comment
Какво ще се случи, ако вашият T клас няма празен конструктор?   -  person porfiriopartida    schedule 27.09.2013
comment
Моят Т клас има празен конструктор   -  person ewerton    schedule 27.09.2013
comment
без параметри не може да се направи. Свиквай.   -  person Luiggi Mendoza    schedule 27.09.2013


Отговори (3)


Можеш да направиш

public class MyClass<T extends MyComponent> {
    private T t;

    MyClass(Class<T> clazz) throws InstantiationException,
            IllegalAccessException {
        t = clazz.newInstance();
    }

}
person Reimeus    schedule 26.09.2013

Поради изтриването на типа, JVM не знае какво е T, така че не може да го инстанцира. Заобиколното решение е да предоставите Class<T> и да го използвате за създаване на нов екземпляр:

public MyClass(Class<T> clazz)
{
    t = clazz.newInstance();
}

Ще трябва да добавите хващане IllegalAccessException и InstantiationException.

person rgettman    schedule 26.09.2013

Не без достъп до обекта от класа на T. Помислете за това, T може да бъде всеки подклас на MyComponent, как изобщо бихте решили кои конструктори са налични за този конкретен подклас?

Изтриването на типа означава, че компилаторът безшумно замества всички "реални" препратки към T с MyComponent.

Ако имате препратка към Class, можете да извикате Class#newInstance или да получите конструктор и да го извикате.

person Norwæ    schedule 26.09.2013