Java 8:使用反射创建具有泛型的类的新实例



我有以下方法:

public Comparator<T> getComparator()  throws ReflectiveOperationException {
    String className = "some.ClassName";
    Class<Comparator<T>> c = Class.forName(className); // (1)
    return (Comparator<T>) c. newInstance();
}

在第(1)行我得到这个错误:

类型不匹配:不能从Class <capture#1-of>来Class<Comparator&lt>在

这段代码有什么问题,我应该如何创建一个Comparator<T>的实例?

目前为止你能得到的最好的是

public <T> Comparator<T> getComparator()  throws ReflectiveOperationException {
    Class<? extends Comparator> implementation
        = Class.forName("some.ClassName").asSubclass(Comparator.class);
    @SuppressWarnings("unchecked")
    final Comparator<T> c = implementation.newInstance();
    return c;
}

注意,仍然有一个未检查的操作,这是不可避免的。运行时类型令牌Comparator.class产生Class<Comparator>而不是Class<Comparator<T>>,这反映了类型擦除,并意味着您可以通过asSubclass使用它来确保Class确实实现了Comparator,但您不能确保它实现了Comparator<T>关于任何<T>。(注意,这个方法甚至不知道T是什么)。因此,ComparatorComparator<T>的转换仍然是未经检查的。

直接移动cast:

Class<Comparator<T>> c = (Class<Comparator<T>>) Class.forName(className); // (1)
return c.newInstance();

试试这个方案

@SuppressWarnings("unchecked")
public Comparator<T> getComparator() throws Exception {
    String className = "some.ClassName";
    Class<?> c = Class.forName(className); // (1)
    return (Comparator<T>) c. newInstance();
}

相关内容

  • 没有找到相关文章

最新更新