A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

简单的吧泛型看了下,有点小乱,
静态中为什么不能定义泛型呢?
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");
        }
}


求答

2 个回复

倒序浏览
本帖最后由 贾联国 于 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,类型转换很正常,就开始错下去了。这些都是编程需要避免的~

这些就是我对这个泛型的了解啦,我也是刚刚才学到的,希望对你有帮助,话说大半夜写了这么多,求加技术分啊。
回复 使用道具 举报
静态函数可以定义泛型啊!只不过静态函数的泛型要单独定义,不能定义在类上。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马