还是关于java泛型的问题:在静态方法中为什么不能引用类级别的类型参数? 15

不要回答因为泛型类型参数需要声明对象时指定,而静态不需要对象就可以引用什么的。这个根本就不是原因。泛型和运行时系统没有一点关系。我解释一下在静态变量中不能使用类型参数的原... 不要回答因为泛型类型参数需要声明对象时指定,而静态不需要对象就可以引用什么的。这个根本就不是原因。泛型和运行时系统没有一点关系。
我解释一下在静态变量中不能使用类型参数的原因:因为静态变量为所有实例共享,如果可以使用,那么当使用不同的类型参数实例化对象时会导致编译器插入强制类型转换代码错误(1.5版泛型指南上有实例解释)。(换句话说泛型的实现机制擦拭法决定了不能再静态变量中使用类型参数)。但是这个问题并不影响静态方法中使用类型参数,而且静态方法可以是泛型方法,既然可以使泛型方法,那我引用类级别的类型参数又怎么了嘛,完全可以的啊。
回楼下的,我只能回答在静态变量中不能使用类型参数,不能回答在静态方法中为什么不能引用类级别的类型参数,我的回答只是抛砖引玉。以前这个问题我问过,很多人都给过我如上回答,其实都不正确。最近看了深入JVM和java1.5泛型指南中文版,又想起这个问题。只想大家帮忙从实现机制擦拭法的角度回答,而不是胡乱猜测。
展开
 我来答
568145421
推荐于2017-11-25 · 知道合伙人软件行家
568145421
知道合伙人软件行家
采纳数:1353 获赞数:6756

向TA提问 私信TA
展开全部
你好,我觉得最主要的原因是因为泛型擦除。
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类型的。

而静态方法不需要构件对象,所以他在调用方法是,根本没有判断参数的约束条件,所以虚拟机压根就不希望这种事情发生,所以在编译时就报错了。
backkid3120
2012-09-21 · TA获得超过457个赞
知道答主
回答量:154
采纳率:0%
帮助的人:90.7万
展开全部
静态变量和静态方法是属于使用泛型参数的基类的,跟泛型无关。
Java目前的泛型还是伪泛型,需要在编译的时候进行强转。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
飛来飛去没
2018-06-29
知道答主
回答量:22
采纳率:0%
帮助的人:1.6万
展开全部
你想想,不管为泛型传入哪一种实参类型,对java来说,依然被当成同一个类处理。那这样的话,你传什么类型给静态方法还有必要吗?没必要。
但是非静态方法就不一样了,你传个dog类,就声明一个dog对象;你传cat类,就声明一个cat对象。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友99ffb75
2018-05-06
知道答主
回答量:1
采纳率:0%
帮助的人:873
展开全部
静态方法只能访问静态类型变量,如果可以访问类型参数就要使其声明位static类型的。而static类型的属性是需要实例化或者赋值的,类型参数是不确定的。所以冲突不能访问
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
love爱有缘
2012-09-17 · TA获得超过1041个赞
知道小有建树答主
回答量:789
采纳率:0%
帮助的人:695万
展开全部
自问自答啊!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式