- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我尝试使用 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/
很抱歉新手的问题,但是: 我最近才发现“=”运算符不只是处理对象/等等。值(value),也是引用。这很酷,但我认为这对变量来说是不一样的,它不会在存储整数或 float 的变量之间创建引用。后来我觉
我是一名优秀的程序员,十分优秀!