为什么可以在类型参数上调用静态方法?

时间:2016-03-20 02:02:26

标签: java generics

我昨天了解到你可以在类型参数上调用静态方法。例如:

public static <T extends Arrays> void main(String[] args) {
    T.sort(args);
}

是否有任何理由允许这样做?它是否可能以某种方式帮助从非通用代码转换为通用代码?

1 个答案:

答案 0 :(得分:2)

我认为这不是明确允许的,而只是说它不被禁止。

JLS 8.4.4 Generic Methods未指定任何不允许使用的类型变量。

JLS 8.1.2 Generic Classes and Type Parameters列出无法使用T 的地方:

  

在以下任何一项中引用泛型类C的类型参数是编译时错误:

     
      
  • C static成员的声明(§8.3.1.1§8.4.3.2§8.5.1)。
  •   
  • 声明嵌套在C。
  • 中的任何类型声明的static成员   
  • C(§8.7)或
  • 的静态初始值设定项   
  • 嵌套在C。
  • 中的任何类声明的静态初始值设定项   

基本上,除非另有说明,否则允许在允许类型的任何地方使用类型变量,并且它们不会列出static方法调用。

故意或疏忽?谁知道,但可能是故意的。由于允许在实例变量上调用静态方法,为什么不允许这样做。仅仅因为它被允许,并不意味着你应该这样做。

正如JLS 4.4 Type Variables所说(强调我的):

  

类型变量是一个非限定标识符,用作类,接口,方法和构造函数体中的类型