Java泛型:带有getClass()的错误参数类型

时间:2018-02-11 22:14:29

标签: java generics

说我有这两种方法:

<T extends MyClass> void method1(Class<T> a, ArrayList<T> b) {
    //whatever
}

<T extends MyClass> void method2(T c) {
    method1(c.getClass(), new ArrayList<T>()); //Here I get compile error: wrong argument type for the second parameter
}

虽然这个其他代码段没有返回任何错误(只有未经检查的强制转换的警告):

<T extends MyClass> void method1(Class<T> a, ArrayList<T> b) {
    //whatever
}

<T extends MyClass> void method2(T c) {
    method1((Class<T>)c.getClass(), new ArrayList<T>());
}

有人可以解释为什么我在第一个例子中得到错误,以及最好的处理方法是什么?

1 个答案:

答案 0 :(得分:1)

public final native Class<?> getClass(); - 这是来自Object类的代码。因此,当您从Class<?>Class<T>进行不安全的投射时,您会收到警告。您可以为JVM提供更大的灵活性:

<T extends MyClass> void method1(Class<T> a, List<T> b) {
    //whatever
}

<T extends MyClass> void method2(T c) {
    method1(c.getClass(), new ArrayList<>());
}

没有警告和编译错误。