gpt4 book ai didi

带有原始泛型类型参数和 Optionals 的 Java 怪异编译错误

转载 作者:搜寻专家 更新时间:2023-11-01 03:47:21 24 4
gpt4 key购买 nike

以下 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> (而不是 Optional<B<Integer>> )但是为什么呢?我看过泛型和类型删除 (JLS 4.8) 的其他问题,但它们都处理在原始类型本身上调用方法时的情况(例如 this )。在这里,opt不是原始的,它只需要一个原始类型参数。另外,为什么第二个版本(其中参数 a 是原始 B 而不是 B<Object> )有效?

编译错误信息

Error java: incompatible types: java.lang.Object cannot be converted to 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();
}
}

关于带有原始泛型类型参数和 Optionals 的 Java 怪异编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43171145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com