Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以对类型参数调用静态方法?_Java_Generics - Fatal编程技术网

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

Java 为什么可以对类型参数调用静态方法?,java,generics,Java,Generics,我昨天了解到,可以对类型参数调用静态方法。例如: public static <T extends Arrays> void main(String[] args) { T.sort(args); } publicstaticvoidmain(字符串[]args){ T.sort(args); } 有什么好的理由允许这样做吗?它可能在某种程度上有助于从非泛型代码向泛型代码的转换吗?我不认为它是明确允许的,只是它没有被禁止 不指定任何不允许使用的类型变量 无法使用T的列表:

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

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

有什么好的理由允许这样做吗?它可能在某种程度上有助于从非泛型代码向泛型代码的转换吗?

我不认为它是明确允许的,只是它没有被禁止

不指定任何不允许使用的类型变量

无法使用
T
的列表:

在以下任何一种情况下引用泛型类C的类型参数都是编译时错误:

  • C(,)的
    静态
    成员的声明
  • 嵌套在C中的任何类型声明的
    静态
    成员的声明
  • C()的静态初始值设定项,或
  • 嵌套在C中的任何类声明的静态初始值设定项
基本上,类型变量可以在任何允许类型的地方使用,除非另有说明,并且它们没有列出
static
method调用

故意还是疏忽?谁知道呢,但可能是故意的。既然允许对实例变量调用静态方法,为什么不允许这样做呢。仅仅因为这是允许的,并不意味着你应该这样做

正如我所说的:

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


不,没有充分的理由允许这样做;它不会按您想象的方式工作(它总是在类型的上限上调用静态方法;例如,即使
t
extended
Arrays
,您仍然会得到
Arrays.sort
)我知道这一点()。考虑到这完全是无用的,我想知道为什么太阳会烦恼?“这太奇怪了。”路易斯瓦瑟曼是对的。此代码与数组.sort(args)
相同。静态方法不能被子类重写。不要在家里尝试这个。这是一个结果。它类似于:这是只有Sun才能回答的奇怪事情之一,我们只能对此做出假设。我试图找到
T.class
明确排除的地方。@PaulBoddington:如果命名类型是类型变量,这是一个编译时错误我也在本规范中找到了
这句话,每当我们谈到一个类或接口类型时,我们也会包括泛型版本,除非明确排除。
(4.5)所以看起来你是对的-之所以允许,只是因为它不被禁止。@Obicere a
类型参数
是一个
类型变量
:如果类声明了一个或多个类型变量,则该类是泛型的。这些类型变量称为类的类型参数。不要混淆。如果表单是主表单,我会发现(15.12.1)
。[TypeArguments]标识符,然后让T作为主表达式的类型。如果T是类或接口类型,则要搜索的类或接口是T;如果T是类型变量,则要搜索的类或接口是T的上限。
。似乎这是明确的讨论。