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
是捕获类型的上界和(特别是)下界。使用带有通配符类型参数的下界表达式是毫无意义的,因为没有实际类型可以满足这一点。在这种情况下,“不符合下界”信息有点误导,但并非不正确。如果这确实是问题所在,那么更清晰的信息应该是“无法满足下限”.

省略代码会适得其反。根据所涉及的代码解释诊断信息要比从头解释容易得多。我希望能在这里放一些代码,但我仍在努力创建一个最小的示例。