为什么用类型参数调用非参数化方法不是错误?

use*_*171 6 java generics

我有以下Java程序,我期望不编译,但它做到了:

class Test {
    public static void f() {
    }

    void m() {
            Test.<String>f();
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么javac允许以这种方式调用非参数化方法?

我的Java编译器版本是:javac 1.7.0_75

Kon*_*kov 5

简单地忽略显式类型参数.

这在JLS第15.12.2.1节中说明:

  • 如果方法调用包含显式类型参数,并且成员是泛型方法,则类型参数的数量等于方法的类型参数的数量.

此子句意味着非泛型方法可能适用于提供显式类型参数的调用.实际上,它可能会变得适用.在这种情况下,类型参数将被忽略.