通用类型解析 - 编译器步骤

时间:2017-07-25 05:10:05

标签: java generics compiler-errors

假设以下方法(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>)

我不完全理解这里的解决步骤,也许有人可以解释为什么我需要类型见证而编译器不会自动推断出类型?

3 个答案:

答案 0 :(得分:3)

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

在您的情况下,当您致电getList()getList2()时,类型T已被推断为Object。这意味着getList()会返回List<Class<Object>>个对象,您无法在其中添加Class<String>个对象。

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

答案 1 :(得分:0)

总之,StringObject,而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<>();
}

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