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

4

我有以下类。

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 等方法,但都没有成功。我需要一些帮助。谢谢你的回答。


你无法创建一个泛型的新实例。可能的替代方案是创建一个工厂来为您完成此操作(只要它是“CustomView”类型,您的类就不会在意)。 - Makoto
1个回答

7
你有两个主要选择。

反射

这种方式不是静态类型安全的。也就是说,编译器不能保护你免受使用没有必要构造函数的类型的影响。

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

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Taehoon Kim
如果您可以传递T的实际实例,则可以使用我提到的任一方法。第一个方法适用于将clsT替换为t.getClass();第二个方法适用于确保CustomView是自限定的并具有make()方法。 - Judge Mental

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接