JDK11 javac类型推断错误消息的解释
我很难理解下面的错误消息:JDK11 javac类型推断错误消息的解释,java,Java,我很难理解下面的错误消息: Program.java:67: error: incompatible types: inferred type does not conform to lower bound(s) .map(result -> ^ inferred: CAP#1 lower bound(s): Document<?>,CAP#1 where CAP#1 is a fresh type-variable: C
Program.java:67: error: incompatible types: inferred type does not conform to lower bound(s)
.map(result ->
^
inferred: CAP#1
lower bound(s): Document<?>,CAP#1
where CAP#1 is a fresh type-variable:
CAP#1 extends Document<?> from capture of ?
Program.java:67:错误:不兼容的类型:推断的类型不符合下限
.map(结果->
^
推断:第1章
下限:文件,第1章
其中CAP#1是一个新类型变量:
CAP#1将文档从捕获扩展到?
- 是否有两个下限,或者下限只是
,其中文档
被转换为?
CAP\1
- 什么是
类型变量fresh
捕获?CAP#1扩展了捕获?
- 这里的问题是推断出一个下限,但需要两个下限,还是其他什么
- 错误是否是因为
不是CAP#1 extends Document
的下限Document
PS:我省略了代码,因为现在我的问题是试图理解此消息所说的内容。尽可能不参考相关代码,并以不同的顺序回答问题:
- 什么是
类型变量fresh
捕获?CAP#1扩展了捕获?
CAP#1
表示,但在本例中这并不是很有用
- 是否有两个下限,或者下限只是
,其中文档
被转换为?
CAP\1
CAP#1
。一个是Document
,另一个是CAP#1
- 这里的问题是推断出一个下限,但需要两个下限,还是其他什么
- 错误是否是因为
不是CAP#1 extends Document
的下限Document
CAP#1 extends Document
不是一个类型表达式,因此它是否可能是绑定到任何东西的较低类型的问题没有意义。相反,消息似乎在说编译器的分析表明CAP#1
必须是Document
的子类型。消息的这一部分只是额外的信息。错误的实际性质的描述是在前面出现的
很难确定实际的问题是什么。类型分析器似乎已经确定捕获的类型是它自己的下限,但这不一定是问题,因为该约束很少得到满足。但是,这无助于编译器捕获特定类型
我怀疑问题的关键在于
Document
是捕获类型的上界和(特别是)下界。使用带有通配符类型参数的下界表达式是毫无意义的,因为没有实际类型可以满足这一点。在这种情况下,“不符合下界”信息有点误导,但并非不正确。如果这确实是问题所在,那么更清晰的信息应该是“无法满足下限”.省略代码会适得其反。根据所涉及的代码解释诊断信息要比从头解释容易得多。我希望能在这里放一些代码,但我仍在努力创建一个最小的示例。