黑马程序员技术交流社区
标题:
静态方法中为什么不能定义泛型呢?还有instanceOf中?
[打印本页]
作者:
suiabing
时间:
2012-5-1 00:28
标题:
静态方法中为什么不能定义泛型呢?还有instanceOf中?
简单的吧泛型看了下,有点小乱,
静态中为什么不能定义泛型呢?
test了一下可以啊,难道是java核心技术错了,不能把,估计是我理解有问题
还有instanceOf中也不可以?
package fanxing;
//类型参数不能在静态方法中使用
class A <T>{
public static <T> void println(){}//可以编译通过
}
class B{
public static void main(String[] args) {
System.out.println("haha");
}
}
求答
作者:
贾联国
时间:
2012-5-1 02:03
本帖最后由 贾联国 于 2012-5-1 02:08 编辑
我总结了一点儿网上的说法,在这里和你分享一下。
1.不应在静态方法中引用封闭类型参数。根据我的看法,在定义一个静态的时候,往往不知道以后输入的的具体类型,而在调用的时候加上参数限定会让程序在类型转换上出问题,例如LZ举的例子,我如果要用多次方法,而 println()方法里的参数不相同,但还是加了泛型 A<String>.println(),A<integer>.println().....,那么在运行的时候会发生ClassCastException!这个貌似没有办法,只能程序员自己注意,不要这么写了。
2.泛型类型参数和基本类型:在学Hashtable的时候,我们将键值对存到Hashtable中的时候可以用new HashMap< String, String>() 进行String到String的映射,但我们很少用HashMap< String, Integer>让int值参加映射,因为本来int值可以自动打包integer的,我们这么定义之后就必须手动打包int值,虽然不会产生异常,却让程序很麻烦。
3.instanceof 操作中的“外露”参数,这个我觉得最为复杂,这里所谓的“外露”是定义在函数主体上的,还拿上面的例子来说,我们要往new HashMap< String, T>() 里面放数据,而条件是instanceOf XXX,我们假设这里的XXX是object,一旦符合要求 ,所有< String, T>都会存到集合中去,关键是这个T,如果这个T是其他的类,例如图形化界面中的Button,那么< String,Button>按理说这里虽然可以存进去,但是我们调用其他不属于Button的方法来执行Button,依然可以编译,
jvm可能会给予警告
,这里的原因是instanceOf的作用是擦除了Button的类型上限,
甚至可以当做object
,但运行下去的话,JVM会觉得Button属于object,类型转换很正常,就开始错下去了。这些都是编程需要避免的~
这些就是我对这个泛型的了解啦,我也是刚刚才学到的,希望对你有帮助,话说大半夜写了这么多,求加技术分啊。
作者:
邓飞飞
时间:
2012-5-1 06:07
静态函数可以定义泛型啊!只不过静态函数的泛型要单独定义,不能定义在类上。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2