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

标签 java generics compiler-errors type-inference compiler-bug

当我尝试使用 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/

相关文章:

java - 为 Tomcat 添加 RAM

java - JCheckBox 列表错误?

c# - List<T> 和数组索引器有什么区别?

generics - 使用泛型时遇到编译器错误

java - 如何将 session 对象放入 HashMap 中

java - 我如何只构建一个包含多个不同应用程序/子项目的 JAR 文件?

java - Android Studio上的错误(方法未从其父类(super class)重写方法)

c - 关于 'Comparison between pointer and integer in C' 的警告

java - Java 类型删除会删除我的泛型类型吗?

java - 泛型的问题