是不是?包括所有的类,也含Object类?
那具体用法方面区别,体验在哪里呢?
那具体用法方面区别,体验在哪里呢?
解决方案 »
- 用JAVA编写
- 奇怪的返回值类型错误
- java打包成jar文件后,要什么支持文件才能在别的电脑运行?
- 新手关于事件派发线程问题,大家讨论^^
- [求助]加载类Configuration出错?--ClassLoader相关
- 高分求教:sqlserver中中文列名的查询问题
- 为什么会出现getOutputStream() has already been call for this response??
- 求java算法实现,比较简单,看大家有没有优化的!
- 使用json-lib是报异常。请帮我看一下
- 大侠支招,来者有分!!!!!!!!!!!!!!
- 将一个字符串中的"\"全部转换为"/"
- 关于FileInputStream 中的read方法和DateoutputStream的困惑
个人感觉这两个没什么区别,?或Object都可以代替所有的类,现在发现另一问题,所有已知的类,都用?
代替好吗?
比如:本来是List<User> userlist=...,我改为List<?> userlist...,这样好像结果没什么影响,但不知对性能或效率方面,有没影响呢,还是都一样,随便用呢?请大家发表下看法吧,虽说小问题,但把它弄清楚了也好点的。
源代码中的作用看下面代码List<User> userlist=new ArrayList<User>();
....
User u=userlist.get(0);
List<?> userlist=new ArrayList<?>();
....
User u=(User)userlist.get(0);
在这种情况下: class<? extends SomeClass> , Object就不能用了Object是一个具体的类名,而?是一个占位符号,表示任何类型,只要是SomeClass类或者子类就可以。
List<Object>可以放任何类对象
List<? extends InputStream>就只能放InputStream的实现类了。运行时刻,没错,Java的泛型是不存在,所以说,效率没有任何影响。
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; // s3Collection<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
?能通配任何类,在诸如<? extends Object>时只能用?
Object可能在类型检查时更好些