Java泛型泛型类型参数和Optionals的奇怪编译错误
发布时间:2020-12-15 02:18:54 所属栏目:Java 来源:网络整理
导读:以下 Java代码无法编译(使用javac 1.8.0_121) import java.util.Optional;class BT {}public class Test { static BInteger f1(BObject a) { return null; } static BInteger f2() { OptionalB opt = Optional.empty(); // note the raw type B return opt.m
以下
Java代码无法编译(使用javac 1.8.0_121)
import java.util.Optional; class B<T> {} public class Test { static B<Integer> f1(B<Object> a) { return null; } static B<Integer> f2() { Optional<B> opt = Optional.empty(); // note the raw type B return opt.map(Test::f1).get(); // error: incompatible types: Object cannot be converted to B<Integer> } } 我的问题是:为什么代码不能像上面那样编译,如果我改变f1来获取原始类型,为什么它会编译: static B<Integer> 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> 解决方法
让f1使用? extends Object,将通配符类型添加到B.
import java.util.Optional; class B<T> {} public class Test { static B<Integer> f1(B<? extends Object> a) { return null; } static B<Integer> f2() { Optional<B<?>> opt = Optional.empty(); // note the raw type B return opt.map(x -> f1(x)).get(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |