在省略类名的同时在本地调用泛型静态方法

Ser*_*ero 5 java generics

这是我要调用/调用的方法.

public static <N,E> void doGenericStatic2(N number, E element) {
    System.out.println(number);
    System.out.println(element);
}
Run Code Online (Sandbox Code Playgroud)

这是我测试调用前一个方法的方法(两者都位于同一个类中MyClass)

    public static void testInvokeGenericMethodLocally() {
        doGenericStatic2(100, "Text");
//      <Integer,String>doGenericStatic2(100, "Text"); //Syntax error, insert "super ( ) ;" to complete Statement
        MyClass.doGenericStatic2(100, "Text");
        MyClass.<Integer,String>doGenericStatic2(100, "Text");
    }
Run Code Online (Sandbox Code Playgroud)

为什么这种特殊情况(第二次调用测试)会<Integer,String>doGenericStatic2(100, "Text");产生编译时错误?

ysh*_*vit 3

JLS 15.12对此进行了描述,它描述了方法调用语法:

MethodInvocation:
  MethodName ( [ArgumentList] ) 
  TypeName . [TypeArguments] Identifier ( [ArgumentList] ) 
  ExpressionName . [TypeArguments] Identifier ( [ArgumentList] ) 
  Primary . [TypeArguments] Identifier ( [ArgumentList] ) 
  super . [TypeArguments] Identifier ( [ArgumentList] ) 
  TypeName . super . [TypeArguments] Identifier ( [ArgumentList] )
Run Code Online (Sandbox Code Playgroud)

请注意,该[TypeArguments]选项仅当该方法出现在“点状事物”(我对它的技术名称)之后时才可用。JLS 没有具体说明为什么会这样,尽管 Thomas 的评论可能是正确的,否则对于<TypeArguments 开始还是小于会产生歧义。