Как создать экземпляр типового типа с параметром

У меня есть следующий класс.

public class SomeClass<t extends="" customview=""> { 
 public void someMethod() {
 T t; // = new T(context) ...compile error!
 // I want instance of SomeType that have parameter(context) of constructor.
 t.go();
 }
}
</t>

Я хочу создать экземпляр типового типа T с параметром конструктора.

Я попытался TypeToken, Class, newInstance и т.д., но ничего не добился успеха. Мне нужна помощь. Спасибо за ваш ответ.

1 ответ

У вас есть два основных варианта.

Отражение

Этот способ не является статически безопасным. То есть компилятор не дает вам защиты от использования типов, у которых нет необходимого конструктора.

public class SomeClass< T > {
 private final Class< T > clsT;
 public SomeClass( Class< T > clsT ) {
 this.clsT = clsT;
 }
 public someMethod() {
 T t;
 try {
 t = clsT.getConstructor( context.getClass() ).newInstance( context );
 } catch ( ReflectiveOperationException roe ) {
 // stuff that would be better handled at compile time
 }
 // use t
 }
}

Factory

Вы должны объявить или импортировать интерфейс Factory< T>. Абоненту также предъявляется дополнительное бремя, чтобы предоставить его экземпляр конструктору SomeClass, который еще больше разрушает полезность вашего класса. Однако он статически безопасен.

public class SomeClass< T > {
 private final Factory< T > fctT;
 public SomeClass( Factory< T > fctT ) {
 this.fctT = fctT;
 }
 public someMethod() {
 T t = fctT.make( context );
 // use t
 }
}

licensed under cc by-sa 3.0 with attribution.