假定使用以下方法(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
}
第二个和第三个调用编译良好,而第一个则给出:
我在这里不完全了解解决步骤,也许有人可以解释为什么我需要类型见证人,而编译器不会自动推断类型?
最佳答案
因为编译器不会/不能基于将来的方法调用来推断通用参数。
在您的情况下,当您调用getList()
或getList2()
时,T
类型已经被推断为Object
。这意味着getList()
将返回一个List<Class<Object>>
对象,并且您无法在其中添加Class<String>
对象。
在您的第三条语句中,您具有List<Object>
,因此可以向其添加Class<String>
。