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<>());
}