论坛首页 Java版

还是不理解java的泛型

浏览 586 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (16) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-06-26 关键字: java基础
java 5种多了泛型,比如
list<int> ls=new ArrayList();

于是ls就只能装int了,不过我不明白为什么世界要向原始社会发展,

我一直觉得很酷的地方就是java的set集合是直接装object的,意思是
list ls=new ArrayList();
ls.add(123);
ls.add("123");

这个是成立的!,同时往一个地方装int和string,很酷,
但是现在新的泛型似乎没有什么用,让世界支持老的功能而已?

请大家讨论java5之泛型意义何在?
   
最后更新时间:2008-06-26

LZ是对范型的误解

 

相信你是随手写的Java代码吧,list?应该是List吧。

 

其中值得指出的是:<int>是不被允许的,必须为<Integer>

 

还有的就

williamy 写道
我一直觉得很酷的地方就是java的set集合是直接装object的,意思是
...
这个是成立的!,同时往一个地方装int和string,很酷,

 如果你想要回这个功能,范型也能很好的支持。

List<Object> list = new ArrayList<Object>();
list.add(123);
list.add("String");

不过不推荐这么用罢了,毕竟在get的时候非常不方便。

 

如果按照以前的做法,

List xlist = new ArrayList();
xlist.add(123);
String name = (String) xlist.get(0);//这个时候你就挂了

 抛出类转换异常,直接造成程序的不稳定。

范型远不止这么简单,还有诸如 <? extends Object>、<? super Object> 等用法。不要人云亦云,范型的加入不是为了支持老功能,而是为了在支持老功能的基础上将Java变得更简洁更健壮。

   
0 请登录后投票
最后更新时间:2008-06-26
既然本来就是可以装任何类型,那么List<Object>的意义何在?

List<? extends Number> 代表着可以使用Integet Float等等数字类型,
而事实上本来就可以的,不用看ArrayList的实现就可以猜出里面是Object[] XXX来存放list里的值的,那么我现在能够体会到java泛型的唯一好处是“自动监测+装换类型”
因为 List<T> 里应该是这样定义的 public T get(int i)
   
0 请登录后投票
最后更新时间:2008-06-26
泛型带来的类型安全,我也是怀疑的。你向冰箱里放进个大象,不会期待取出来就变成驴了。
   
0 请登录后投票
最后更新时间:2008-06-26
williamy 写道
既然本来就是可以装任何类型,那么List<Object>的意义何在?

 List<Object>仅仅是为了满足你的需求而已,通常是不常这么写的,<>中应该是更具体的类型

 

dennis_zane 写道
泛型带来的类型安全,我也是怀疑的

这点不用怀疑,Java引入了范型之后,将运行时异常更多的转换为编译错误,在编译的时候就发现问题,而不是等到程序运行到这个地方了才唐突的抛出异常。这就是范型更安全的意思。 

 

 

我个人觉得,在使用的时候如果你用了范型加强的集合类相信可读性会比List更好 ----- 谁知道你的List装的是什么..难道还要我亲自翻遍整个源代码去找?

   
0 请登录后投票
最后更新时间:2008-06-26
williamy 写道
既然本来就是可以装任何类型,那么List<Object>的意义何在?

List<? extends Number> 代表着可以使用Integet Float等等数字类型,
而事实上本来就可以的,不用看ArrayList的实现就可以猜出里面是Object[] XXX来存放list里的值的,那么我现在能够体会到java泛型的唯一好处是“自动监测+装换类型”
因为 List<T> 里应该是这样定义的 public T get(int i)



如果要你实现这种效果:

T max(T a, T b)       // 求出两个数中的较大者
{
      return  (a > b) ? a : b;
}

你会怎么做?
Object max(Object a, Object b)       // 求出两个数中的较大者
{
      。。。//这里怎么写?,就算你写出来了,想想使用者多么痛苦
}


所以不仅仅是安全一点点.

如果 List<T> 中是一个Customer 对象,当使用者 通过list.get(0)的时候,当然想直接得到一个
customer 而不是一个可恶的 Object ,说不定这个Object 还是只狗, 当使用者 customer = (Customer)object 时
会是什么表情呢?

STL有三要素:算法(algorithm)、容器(container)和迭代器(iterator)

:-)
   
0 请登录后投票
最后更新时间:2008-06-26
省得每次取出来都要强制转化了  而且还有别的用途  你查查别人写的翻新dao
   
0 请登录后投票
最后更新时间:2008-06-26
泛型只是在编译的时候有用, 让编译器可以更方便的检查出你有没有在集合中装入不合法的对象以及在类型转换的时候出现的转换错误, 用泛型编译后的class文件和不用泛型编译的文件是一模一样的。

泛型是为了让你写代码更身心。
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐