如何使用参数创建泛型类型的实例

时间:2015-02-11 15:41:51

标签: java generics types instance

我有下课。

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的实例。

我尝试TypeTokenClass<T>newInstance等,但没有成功。我想要一些帮助。谢谢你的回答。

1 个答案:

答案 0 :(得分:6)

您有两个主要选择。

反射

这种方式不是静态类型安全的。也就是说,编译器无法保护您不使用没有必要构造函数的类型。

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< 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
    }
}