作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
给定泛型方法:
<T> List<T> getGenericList(int i) {...}
以下代码在没有任何警告的情况下编译:
public List<String> getStringList(boolean b){
if(b)
return getGenericList(0);
else
return getGenericList(1);
}
但是这个会产生“类型不匹配”编译错误:
public List<String> getStringList(boolean b) {
return (b) ? getGenericList(0) : getGenericList(1);
}
为什么?
最佳答案
这不是泛型问题,而是编译器必须推断三元表达式类型的方式的结果。
对于这个等价的代码,情况也是一样的。此代码有效:
public byte function(boolean b){
if(b)
return 1;
else
return 2;
}
虽然这不是:
public byte function(boolean b) {
return (b) ? 1 : 2;
}
原因是当编译器试图推断这个表达式的类型时
return (b) ? 1 : 2;
它首先必须获取每个操作数的类型,并检查它们是否兼容(reference)以评估三元表达式是否有效。 如果传播“返回”的类型以自动转换或提升每个操作数,则可能导致根据上下文以不同方式解析三元表达式的类型> 这个表达式。
鉴于“返回”的类型不能传播到操作数,那么在提到的情况下:
return (b) ? getGenericList(0) : getGenericList(1);
无法绑定(bind)泛型,所以每个操作数的类型都解析为List<Object>
.然后编译器得出结论,整个表达式的类型是List<Object>
。 , 无法自动转换为 List<Integer>
(因为它们不是兼容的类型)。
而另一个
return getGenericList(0);
它应用“返回”的类型来绑定(bind)泛型类型 T,因此编译器得出结论,该表达式具有 List<String>
。类型,可以安全返回。
关于java - java泛型方法的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6535144/
我是一名优秀的程序员,十分优秀!