簡體   English   中英

Java語法:NonWildcardTypeArguments

[英]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只要求每個類型參數都是一個ReferenceTypeSet<? extends Object> Set<? extends Object> satisfies,因為它的形式是Identifier<TypeArgument> ? extends ObjectTypeArgument ,但不是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM