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。
- 啊,好吧,我明白了,谢谢你的简单解释。
- 但这并不是一些"未来"的电话。它是一个立即调用,紧接着用一个立即点链接在一起。
- @用户1589188,是的,目前它还不适用于链接方法调用,但它是jep:openjdk.java.net/jep s/101的一部分。
- @我咯咯地笑着,看到它是"101",但它还没有出现。
用类似的东西代替:
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 <>();
} |
现在,当调用它时,参数和返回类型必须匹配。
总之,String是Object,而Class不是Class。
参考文献:JavaDoc