我在初始化带有类型参数的类时遇到问题。这似乎是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)。在运行时,泛型几乎消失了

10-07 19:16
查看更多