Java 语法:NonWildcardTypeArguments

Java syntax: NonWildcardTypeArguments

下面是jls第18章定义的https://docs.oracle.com/javase/specs/jls/se7/html/jls-18.html

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> 满足,因为它的形式是 Identifier<TypeArgument>。 (? extends ObjectTypeArgument,但不是 ReferenceType。)

例如,<Set<? extends Object>>NonWildcardTypeArguments<? extends Set<Object>> 不是。

所以是的,有一个通配符 "in" 类型参数,但它嵌套在树中的下一层。 NonWildcardTypeArguments 构造只关心它内部的参数。

无论如何,正如 assylias 指出的那样,这个语法结构似乎不再存在,但我想解释仍然很有趣。 (我尝试在 JLS 8 PDF 中搜索 'NonWildcardTypeArguments',但没有找到任何结果。)