假设以下方法(Java 8):
public <T> List<Class<T>> getList() {
return new ArrayList<>();
}
public <T> List<T> getList2() {
return new ArrayList<>();
}
以下代码使用这些方法:
@Test
public void testLists() {
getList().add(String.class); // Does not compile
this.<String>getList().add(String.class); // Compiles
getList2().add(String.class); // Compiles
}
第二次和第三次调用编译正常,而第一次调用则给出:
列表中的
add(java.lang.Class<java.lang.Object>)
无法应用于add(java.lang.Class<java.lang.String>)
我不完全理解这里的解决步骤,也许有人可以解释为什么我需要类型见证而编译器不会自动推断出类型?
答案 0 :(得分:3)
因为编译器没有/不能根据将来的方法调用推断泛型参数。
在您的情况下,当您致电getList()
或getList2()
时,类型T
已被推断为Object
。这意味着getList()
会返回List<Class<Object>>
个对象,您无法在其中添加Class<String>
个对象。
在您的第三个声明中,您有List<Object>
,因此您可以向其添加Class<String>
。
答案 1 :(得分:0)
总之,String
是Object
,而Class<String>
不是Class<Object>
REF:javadoc
答案 2 :(得分:0)
使用类似的东西代替:
getList().add(String.class);
<String>getList().add(String.class);
for
public <T> List<Class<T>> getList() {
return new ArrayList<>();
}
现在,当你调用它时,参数和返回类型必须匹配。