Создание универсального типа

Мой код:

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
Мой класс T имеет пустой конструктор   -  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#newInstance или получить конструктор и вызвать его.

person Norwæ    schedule 26.09.2013