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

Java泛型:getClass()的参数类型错误,java,generics,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

假设我有两种方法:

<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
}
void方法1(a类,数组列表b){
//随便
}
无效方法2(TC){
method1(c.getClass(),new ArrayList());//这里我得到了编译错误:第二个参数的参数类型错误
}
而另一个代码段不返回任何错误(仅针对未选中的强制转换发出警告):

void方法1(a类,数组列表b){
//随便
}
无效方法2(TC){
方法1((类)c.getClass(),newArrayList());
}

有人能解释一下为什么我在第一个示例中出现错误,以及处理这个错误的最佳方法是什么吗?

公共最终本机类getClass()-这是来自
对象
类的代码。在发出警告之前,何时从
Class
Class
进行不安全强制转换。您可以为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<>());
}
void方法1(a类,b类){
//随便
}
无效方法2(TC){
方法1(c.getClass(),newArrayList());
}

没有警告和编译错误。

OT但没有扩展
String
c.getClass()
ClassType,对于泛型
T
的值
c
c.getClass()
不保证返回
Class
,因为
c
不一定严格属于
T
类型,而是属于可分配给
T
的某种(未知)类型。(就此而言,
c
甚至可能是空的!)@alephz3r0-
String
final
::您可以让您的方法接受更精确的
数组列表:()“实际的结果类型是CLASS,它仍然会擦除到
对象
。从该声明中返回一个
ArrayList
。在这种情况下,开发人员会因为编译器还没有发出嘎嘎声而产生错误的安全感。如果您确实尝试使用该数组列表,则不能。它看起来像是转换为
arraylist不要忘记,在运行时,所有
Class
List
都变成
ClassYes,如果调用方法签名的目的是确保它不是
对象
@Makoto,那么这就是一个问题。这确实确保了
method1
中的类型安全。数组将是
T extends MyClass
P.s。这与您的副本无关。
<T extends MyClass> void method1(Class<T> a, List<T> b) {
    //whatever
}

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