假定使用以下方法(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>

10-05 23:40