Мой код:
public class MyClass<T extends MyComponent> {
private T t;
public MyClass(){
t = new T();
}
}
Но компилятор не принимает новый T(). Есть ли способ сделать это с помощью конструктора MyClass() без параметров?
Мой код:
public class MyClass<T extends MyComponent> {
private T t;
public MyClass(){
t = new T();
}
}
Но компилятор не принимает новый T(). Есть ли способ сделать это с помощью конструктора MyClass() без параметров?
Вы могли бы сделать
public class MyClass<T extends MyComponent> {
private T t;
MyClass(Class<T> clazz) throws InstantiationException,
IllegalAccessException {
t = clazz.newInstance();
}
}
Из-за стирания типа JVM не знает, что такое T
, поэтому не может создать его экземпляр. Обходной путь — предоставить Class<T>
и использовать его для создания нового экземпляра:
public MyClass(Class<T> clazz)
{
t = clazz.newInstance();
}
Вам нужно будет добавить ловлю IllegalAccessException
и InstantiationException
.
Не без доступа к объекту класса T. Подумайте об этом, T может быть любым подклассом MyComponent, как бы вы вообще решили, какие конструкторы доступны в этом конкретном подклассе?
Стирание типа означает, что компилятор молча заменяет все «настоящие» ссылки на T на MyComponent.
Если у вас есть ссылка на класс, вы можете вызвать Class#newInstance
или получить конструктор и вызвать его.
T
как параметр в конструкторе. - person qqilihq   schedule 27.09.2013