将模板参数传递给Class#newInstance()

时间:2017-10-24 21:08:35

标签: java generics reflection interface

我有以下课程:

class Processor<T> {
    void process( T request ) {...}
}

然后我打电话给以下人员:

Processor<String> p = Processor.class.newInstance();

Eclipse抱怨,作为对 Processor.class.newInstance()的警告:

  

&#34;类型安全:处理器类型的表达式需要取消选中   转换为符合处理器&lt;串GT;&#34;

如何为此表达式指定模板参数?类似的东西:

Processor<String> p = Processor.class.newInstance<String>();

2 个答案:

答案 0 :(得分:0)

通过使用供应商,您已在评论中回答了警告的原因,可在Java 8中找到:

class Ideone {

    public static void main(String[] args) {
        ProcessorFactory<Processor<String>> pf = 
                     new ProcessorFactory(Processor<String>::new);
        Processor<String> p = pf.build();
        p.process("Ciao!");
    }
}

class Processor<T> {
    void process( T request ) {
        System.out.println(request);
    }
}

class ProcessorFactory<T> {
    private Supplier<T> supplier;

    ProcessorFactory(Supplier<T> supplier) {
        this.supplier = supplier;
    }

    T build() {
        return supplier.get();
    }
}

基本上,您将生成委托给外部工厂主力,通过Supplier获取馈送类型,Processor<String>::new是对构造函数的参考(参数化)。

这么小的好处是很多工作,我不确定我会这样做。

演示:https://ideone.com/GxQOxG

答案 1 :(得分:0)

  

我给出了Processor

的一些未知具体实现的类对象

而不是尝试

Processor<String> processor = ConcreteProcessor.class.newInstance(); //warning

您可以简单地使用您拥有的类对象:

Processor<String> processor = classOfConcreteProcessor.newInstance();

取决于更大的系统&#39;你提到过,类型信息是否可用。

如果在您的情况下无法进行类型推断,您将

  • 必须围绕它建立,例如使用工厂/供应商
  • 信任自己并压制编译器警告