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