我在初始化带有类型参数的类时遇到问题。这似乎是Java类型推断的一个缺点,我想知道是否有解决此问题的方法或实现此目的的更好方法。
public class ParentModel {}
public class ChildModel extends ParentModel {}
public class Service<E extends ParentModel, T extends Collection<E>> {
private Class<T> classOfT;
private Class<E> classOfE;
public Service(Class<E> classOfE, Class<T> classOfT) {
this.classOfE = classOfE;
this.classOfT = classOfT;
}
}
public class BusinessLogic {
public void someLogic() {
Service<ChildModel, ArrayList<ChildModel>> service = new
Service<ChildModel, ArrayList<ChildModel>>(ChildModel.class, ArrayList.class);
}
}
编译时错误在
BusinessLogic::someLogic()
中:编译为Java 7。
最佳答案
因为Java中的泛型是“通过擦除”实现的,所以没有Class<ArrayList<ChildModel>>>
,只有Class<ArrayList>
。
您可以做的就是允许父类(super class)型。
Class<? super T> classOfT;
Class<? super E> classOfE;
public Service(Class<? super E> classOfE, Class<? super T> classOfT) {
或者,您可以双播类(class):
Class<ArrayList<Integer>> clazz =
(Class<ArrayList<Integer>>) (Class<? super ArrayList>)
ArrayList.class;
但要注意:该类只是
ArrayList
-Java在运行时不会对泛型进行其他类型检查。你自己看:ArrayList<Integer> a1 = new ArrayList<>();
ArrayList<Double> a2 = new ArrayList<>();
System.out.println(a1.getClass() == a2.getClass());
这是同一个类(class)。在运行时,泛型几乎消失了