Моят код е:
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, можете да извикате Class#newInstance
или да получите конструктор и да го извикате.
T
като параметър в конструктора. - person qqilihq   schedule 27.09.2013