关于java:通用类型解析 – 编译器步骤

Generic Type Resolution - Compiler Steps

假设(the following Java方法:8)P></

1
2
3
4
5
6
7
public <T> List<Class<T>> getList() {
  return new ArrayList<>();
}

public <T> List<T> getList2() {
  return new ArrayList<>();
}

与那些使用方法:下面代码P></

1
2
3
4
5
6
@Test
public void testLists() {
  getList().add(String.class); // Does not compile
  this.<String>getList().add(String.class); // Compiles
  getList2().add(String.class); // Compiles
}

第二和第三结束呼叫编译:第一,给一whereas theP></

add(java.lang.Class) in List cannot be applied to
add(java.lang.Class)

全面了解分辨率的Do not the steps也许可以解释为什么有人在这里,I need the type does not and the见证编译型infer the automatically。P></


因为编译器不会/无法根据将来的方法调用推断泛型参数。

在您的例子中,当您调用getList()getList2()时,类型T已经被推断为Object。这意味着getList()将返回一个List>对象,并且不能在其中添加Class对象。

在您的第三个声明中,您有List,因此您可以在其中添加Class


用类似的东西代替:

1
2
3
4
5
6
7
getList().add(String.class);

<String>getList().add(String.class);
for
 public <T> List<Class<T>> getList() {
  return new ArrayList<>();
}

现在,当调用它时,参数和返回类型必须匹配。


总之,StringObject,而Class不是Class

参考文献:JavaDoc