以下
Java代码无法编译(使用javac 1.8.0_121)
import java.util.Optional;
class B {}
public class Test {
static B f1(B a) { return null; }
static B f2() {
Optional opt = Optional.empty(); // note the raw type B
return opt.map(Test::f1).get();
// error: incompatible types: Object cannot be converted to B
}
}
我的问题是:为什么代码不能像上面那样编译,如果我改变f1来获取原始类型,为什么它会编译:
static B f1(B a) { return null; } // program compiles with raw B
我的猜测是opt.map被推断为返回Optional< Object> (而不是可选< B>)但为什么?我已经查看了泛型和类型擦除(JLS 4.8)的其他问题,但它们都处理了在原始类型本身上调用方法时的情况(例如this).这里,opt不是原始的,它只需要一个原始类型参数.另外,为什么第二个版本(参数a是原始B而不是B< Object>)有效?
编译错误消息
错误java:不兼容的类型:java.lang.Object无法转换为B< java.lang.Integer>