[英]In java what is the purpose of NonWildcardTypeArguments following the new keyword?
[英]Java syntax: NonWildcardTypeArguments
以下內容在jls https://docs.oracle.com/javase/specs/jls/se7/html/jls-18.html的第18章中定義。
NonWildcardTypeArguments:
< TypeList >
TypeList:
ReferenceType { , ReferenceType }
ReferenceType:
Identifier [TypeArguments] { . Identifier [TypeArguments] }
TypeArguments:
< TypeArgument { , TypeArgument } >
TypeArgument:
ReferenceType
? [ (extends | super) ReferenceType ]
根據NonWildcardTypeArguments的名稱,它不應該允許通配符。 但是下面的代碼編譯
public class NonWildcardTypeArgumentsTest {
public void test(Test<java.util.Set<? extends Object>> args) {
}
}
class Test<T> {}
此示例中的類型參數滿足NonWildcardTypeArguments的定義,它包含通配符:
<java.util.Set<? extends Object>>
我很困惑。 為什么有效? 謝謝
通配符是Set
的類型參數,而不是Test
。 這里的語法是一個樹狀結構,其中每個類型參數都適用於它之外的類型。
Test<T>
↓
Set<E>
↓
? extends Object
NonWildcardTypeArguments
只要求每個類型參數都是一個ReferenceType
, Set<? extends Object>
Set<? extends Object>
satisfies,因為它的形式是Identifier<TypeArgument>
。 ( ? extends Object
是TypeArgument
,但不是ReferenceType
。)
例如, <Set<? extends Object>>
<Set<? extends Object>>
是一個NonWildcardTypeArguments
但<? extends Set<Object>>
<? extends Set<Object>>
不是。
所以是的,類型參數中存在一個通配符,但它嵌套在樹中的一個級別。 NonWildcardTypeArguments
構造只關心它內部的參數。
無論如何,正如assylias指出的那樣,這種語法結構似乎不再存在,但我想這個解釋仍然很有趣。 (我嘗試在JLS 8 PDF中搜索“NonWildcardTypeArguments”並沒有提出任何建議。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.