gpt4 book ai didi

java - 令人惊讶的 "inferred type does not conform to upper bound"错误

转载 作者:行者123 更新时间:2023-11-30 05:54:23 25 4
gpt4 key购买 nike

当我尝试使用 JDK 9、10 或 11 的编译器编译这个精简示例时:

public class UpperBounder {
public static void main(String[] args) {
print(Stream.of("a", "z", "b").collect(Collectors.toCollection(TreeSet::new)));
}

static void print(Set<?> set) {
System.out.println(set);
}
}

我收到此错误:

error: incompatible types: inferred type does not conform to upper bound(s)

print(Stream.of("a", "z", "b").collect(Collectors.toCollection(TreeSet::new)));
^

inferred: INT#1
upper bound(s): Collection<String>,Set<?>,Object
where INT#1 is an intersection type:
INT#1 extends Object,Set<?>,Collection<String>

当我尝试使用 JDK 1.8.0_121 编译它时,出现了不同的错误。但是当我或同事尝试使用 JDK 1.8.0_05、1.8.0_20、1.8.0_40 或 1.8.0_45 编译它时,它编译得很好!

替换 TreeSet::new() -> new TreeSet<>()使此编译在所有版本上都不会出现错误。

我认为这个程序显然是合理的:print 的论点将是 TreeSet<String> ,符合Set<?> 。此外,错误消息对我来说毫无意义:交集类型为 Object , Set<?> ,和Collection<String>应符合上限,即 Collection<String> , Set<?> ,和Object !

这是怎么回事?这是一个错误吗?或者这就是类型推断应该如何工作的?为什么之前有效?我怎样才能让它再次工作(不使用 lambda 而不是方法引用)?

最佳答案

这看起来像错误:https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8219318截至 2019 年 7 月 16 日,Oracle 已确认他们可以重现此错误,但尚未修复。

您的测试用例和错误数据库中的测试用例都可以使用 Oracle 1.8.0_191 重现,并且在使用 ecj (Eclipse) 的所有测试版本中都可以正常工作。

关于java - 令人惊讶的 "inferred type does not conform to upper bound"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53430812/

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