加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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();
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读