[英]Interpretation of JDK11 javac type inference error message
我很難理解下面的錯誤消息:
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 ?
Document<?>
where ?
轉換為CAP#1
?fresh
的類型變量?CAP#1 extends Document<?> from capture of?
from capture of?
CAP#1 extends Document<?>
不是 Document<?> 的下限Document<?>
?PS:我省略了代碼,因為現在我的問題是試圖理解這條消息在說什么。
盡我所能不參考相關代碼,並以不同的順序提出問題:
- 什么是
fresh
的類型變量?
它是類型分析器在分析報告診斷的同一語句的過程中發明的合成類型變量。 與通過分析前面的某些語句產生的常規類型變量或合成類型變量進行對比。
CAP#1 extends Document<?> from capture of?
from capture of?
不多。 它討論的是CAP#1
表示的類型表達式的值,但在這種情況下,這並不是很豐富。
- 是否有兩個下限或下限只是
Document<?>
where?
轉換為CAP#1
?
我將消息解釋為CAP#1
必須遵守兩個下限。 一個是Document<?>
,另一個是CAP#1
。
- 這里的問題是推斷出一個下限但需要兩個下限還是其他什么?
別的東西。 類型分析確定給定類型必須遵守多個下限並沒有本質上的錯誤。
- 錯誤是因為
CAP#1 extends Document<?>
不是 Document<?> 的下限Document<?>
?
不。作為一個整體, CAP#1 extends Document<?>
不是類型表達式,因此它是否可能是綁定到任何東西的較低類型的問題沒有意義。 相反,該消息似乎是在說編譯器的分析表明CAP#1
必須是Document<?>
的子類型。 這部分消息只是額外的信息。 錯誤的實際性質的描述是前面的內容。
很難確定實際問題是什么。 看起來類型分析器已經確定捕獲的類型是它自己的下限,但這不一定是一個問題,因為該約束很容易得到滿足。 但是,這並不能幫助編譯器捕獲特定類型。
我懷疑問題的症結在於Document<?>
是捕獲類型的上限和(尤其是)下限。 有一個帶有通配符類型參數的下限表達式是沒有意義的,因為沒有實際類型可以滿足它。 在這種情況下,“不符合下限”消息有點誤導,但並非不正確。 如果這確實是問題,那么更清晰的信息將是“無法滿足下限”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.