还是关于java泛型的问题:在静态方法中为什么不能引用类级别的类型参数? 15
不要回答因为泛型类型参数需要声明对象时指定,而静态不需要对象就可以引用什么的。这个根本就不是原因。泛型和运行时系统没有一点关系。我解释一下在静态变量中不能使用类型参数的原...
不要回答因为泛型类型参数需要声明对象时指定,而静态不需要对象就可以引用什么的。这个根本就不是原因。泛型和运行时系统没有一点关系。
我解释一下在静态变量中不能使用类型参数的原因:因为静态变量为所有实例共享,如果可以使用,那么当使用不同的类型参数实例化对象时会导致编译器插入强制类型转换代码错误(1.5版泛型指南上有实例解释)。(换句话说泛型的实现机制擦拭法决定了不能再静态变量中使用类型参数)。但是这个问题并不影响静态方法中使用类型参数,而且静态方法可以是泛型方法,既然可以使泛型方法,那我引用类级别的类型参数又怎么了嘛,完全可以的啊。
回楼下的,我只能回答在静态变量中不能使用类型参数,不能回答在静态方法中为什么不能引用类级别的类型参数,我的回答只是抛砖引玉。以前这个问题我问过,很多人都给过我如上回答,其实都不正确。最近看了深入JVM和java1.5泛型指南中文版,又想起这个问题。只想大家帮忙从实现机制擦拭法的角度回答,而不是胡乱猜测。 展开
我解释一下在静态变量中不能使用类型参数的原因:因为静态变量为所有实例共享,如果可以使用,那么当使用不同的类型参数实例化对象时会导致编译器插入强制类型转换代码错误(1.5版泛型指南上有实例解释)。(换句话说泛型的实现机制擦拭法决定了不能再静态变量中使用类型参数)。但是这个问题并不影响静态方法中使用类型参数,而且静态方法可以是泛型方法,既然可以使泛型方法,那我引用类级别的类型参数又怎么了嘛,完全可以的啊。
回楼下的,我只能回答在静态变量中不能使用类型参数,不能回答在静态方法中为什么不能引用类级别的类型参数,我的回答只是抛砖引玉。以前这个问题我问过,很多人都给过我如上回答,其实都不正确。最近看了深入JVM和java1.5泛型指南中文版,又想起这个问题。只想大家帮忙从实现机制擦拭法的角度回答,而不是胡乱猜测。 展开
5个回答
展开全部
你好,我觉得最主要的原因是因为泛型擦除。
class Demo<T> {
public void add(T t) {
//...
}
}
编译后通过反编译:
D:\test>javap -s -p Demo
Compiled from "Demo.java"
public class Demo extends java.lang.Object{
public Demo();
Signature: ()V
public void add(java.lang.Object);
Signature: (Ljava/lang/Object;)V
}
所以,非静态方法正是由于需要先有对象,进而在使用泛型的时候可以确定安全检查的限制条件。
Demo<String> d = new Demo<String>() ;
d.add("str") ; //这里你就只能添加String类型的。
而静态方法不需要构件对象,所以他在调用方法是,根本没有判断参数的约束条件,所以虚拟机压根就不希望这种事情发生,所以在编译时就报错了。
class Demo<T> {
public void add(T t) {
//...
}
}
编译后通过反编译:
D:\test>javap -s -p Demo
Compiled from "Demo.java"
public class Demo extends java.lang.Object{
public Demo();
Signature: ()V
public void add(java.lang.Object);
Signature: (Ljava/lang/Object;)V
}
所以,非静态方法正是由于需要先有对象,进而在使用泛型的时候可以确定安全检查的限制条件。
Demo<String> d = new Demo<String>() ;
d.add("str") ; //这里你就只能添加String类型的。
而静态方法不需要构件对象,所以他在调用方法是,根本没有判断参数的约束条件,所以虚拟机压根就不希望这种事情发生,所以在编译时就报错了。
展开全部
静态变量和静态方法是属于使用泛型参数的基类的,跟泛型无关。
Java目前的泛型还是伪泛型,需要在编译的时候进行强转。
Java目前的泛型还是伪泛型,需要在编译的时候进行强转。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你想想,不管为泛型传入哪一种实参类型,对java来说,依然被当成同一个类处理。那这样的话,你传什么类型给静态方法还有必要吗?没必要。
但是非静态方法就不一样了,你传个dog类,就声明一个dog对象;你传cat类,就声明一个cat对象。
但是非静态方法就不一样了,你传个dog类,就声明一个dog对象;你传cat类,就声明一个cat对象。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
静态方法只能访问静态类型变量,如果可以访问类型参数就要使其声明位static类型的。而static类型的属性是需要实例化或者赋值的,类型参数是不确定的。所以冲突不能访问
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
自问自答啊!!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询