我有以下方法:
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<>在
这段代码有什么问题,我应该如何创建一个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
是什么)。因此,Comparator
到Comparator<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();
}