关于泛型,请问,Class与Class有何区别呢?
xzytest 2010-11-06 11:25:22
是不是?包括所有的类,也含Object类?
那具体用法方面区别,体验在哪里呢?
...全文
531 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ComputerFans 2010-11-07
  • 打赏
  • 举报
回复
两者有时作用相同
?能通配任何类,在诸如<? extends Object>时只能用?
Object可能在类型检查时更好些
waiter081 2010-11-07
  • 打赏
  • 举报
回复
LIst和List<?>那不是没区别???????
sbaiss 2010-11-07
  • 打赏
  • 举报
回复
应该没区别。。。
xzytest 2010-11-06
  • 打赏
  • 举报
回复
自己顶下
个人感觉这两个没什么区别,?或Object都可以代替所有的类,现在发现另一问题,所有已知的类,都用?
代替好吗?
比如:本来是List<User> userlist=...,我改为List<?> userlist...,这样好像结果没什么影响,但不知对性能或效率方面,有没影响呢,还是都一样,随便用呢?请大家发表下看法吧,虽说小问题,但把它弄清楚了也好点的。
huanok 2010-11-06
  • 打赏
  • 举报
回复
学习了。。。
  • 打赏
  • 举报
回复
泛型得弄清楚下面这些的区别

1,List
2,List<Object>
3,List<Number>
4,List<?>
5,List<? extends Number>
6,List<? super Long>

普通的泛型使用估计没啥问题,但是带上 ? 的泛型就会变得很复杂。

对于 <? super T> 和 <? extends T> 看看这个例子:

如果要将某一个数组中的元素拷贝至另一个的话

1,先看看这个方法签名:
public static <T> void copy(List<T> src, List<T> dest)

如果 src 和 dest 是相同泛型参数的话,这个签名是没有问题,但是由于泛型类与数组不一样,
由于泛型类并不具有协变性,也就是说下面的代码是错误的:
List<Object> objs = new ArrayList<Long>();

数组是协变性的,下面的代码是正确的:
Object[] objs = new Long[4];

用这个 copy 方法的话,如果 src 是 List<Long>,而 dest 是 List<Object> 的话,这样
就会产生编译错误。但是实际上 List<Long> 中的每一个元素是可以赋值给 List<Object> 的,
因此这个 copy 方法签名还有待完善。

由于泛型类不具有协变性,但是 Java 的泛型提供了一个通配符类型 ? 使用这个可以将泛型类变
成协变的,下面的代码是正确的:
List<? extends Object> objs = new ArrayList<Long>();

<? extends Object> 表示泛型是 Object 或者是 Object 的子类型,同理
<? super Long> 表示泛型是 Long 或者是 Long 的父类型。

这样就可以把 copy 方法完善成为:
public static <T> void copy (List<? extends T> src, List<? super T> dest)

至于其他的,看看下面的语句哪些正确的,哪些是不正确的?

Pair 是个泛型类,SubTypeOfPair 是 Pair 的子类

Collection<Pair<String, Long>> c1 = new ArrayList<Pair<String, Long>>();

Collection<Pair<String, Long>> c2 = c1; // s1
Collection<Pair<String, ?>> c3 = c1; // s2
Collection<? extends Pair<String, ?>> c4 = c1; // s3


Collection<SubTypeOfPair<String, Long>> c1 = new ArrayList<SubTypeOfPair<String, Long>>();

Collection<Pair<String, Long>> c2 = c1; // s4
Collection<SubTypeOfPair<String, Long>> c3 = c1; // s5
Collection<Pair<String, ?>> c4 = c1; // s6
Collection<? extends Pair<String, ?>> c5 = c1; // s7


上面的这些是从我原来回复过的帖子拷贝过来的,供为参考,呵呵 :)
http://topic.csdn.net/u/20080906/14/efc88816-ba71-473e-8c8d-7a519a1d40c7.html

另外,这里有个关于 Java 泛型 FAQ 的站点,里面有很多东西,有兴趣的话可以去看看:
http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html
24K純帥 2010-11-06
  • 打赏
  • 举报
回复
差别不大,学习了。。
小_饭 2010-11-06
  • 打赏
  • 举报
回复
围观。。自己也不懂。。
efpsy 2010-11-06
  • 打赏
  • 举报
回复
泛型中使用通配符?代表类型参数可以是任何对象类型,也可以使用extends表示参数类型可以是某类或其子类,参数类型主要是用于解决早期版中集合取数据时的拆箱操作
专注or全面 2010-11-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 clariones 的回复:]
? 和 Object 差不多,不过还是有差别。
在这种情况下: class<? extends SomeClass> , Object就不能用了

Object是一个具体的类名,而?是一个占位符号,表示任何类型,只要是SomeClass类或者子类就可以。
List<Object>可以放任何类对象
List<? extends InputStream>就只能放InputStream的实现类……
[/Quote]

???
clariones 2010-11-06
  • 打赏
  • 举报
回复
? 和 Object 差不多,不过还是有差别。
在这种情况下: class<? extends SomeClass> , Object就不能用了

Object是一个具体的类名,而?是一个占位符号,表示任何类型,只要是SomeClass类或者子类就可以。
List<Object>可以放任何类对象
List<? extends InputStream>就只能放InputStream的实现类了。

运行时刻,没错,Java的泛型是不存在,所以说,效率没有任何影响。
houjin_cn 2010-11-06
  • 打赏
  • 举报
回复
java中的泛型只是源代码中有用, 减少一些类型强转,方便书写和查错, 编译为字节码后其实都一样了;
源代码中的作用看下面代码

List<User> userlist=new ArrayList<User>();
....
User u=userlist.get(0);


List<?> userlist=new ArrayList<?>();
....
User u=(User)userlist.get(0);

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧