黑马程序员技术交流社区
标题:
泛型问题
[打印本页]
作者:
邱成
时间:
2012-10-4 23:20
标题:
泛型问题
本帖最后由 邱成 于 2012-10-5 07:32 编辑
import java.util.*;
public class TestCollections {
public static void main(String[] args) {
List l = new LinkedList(); //A
for(int i=0; i<15; i++) {
l.add("a" + i);
}
System.out.println(l);
Collections.shuffle(l);
System.out.println(l);
Collections.reverse(l);
System.out.println(l);
Collections.sort(l);
System.out.println(l);
System.out.println(Collections.binarySearch(l, "a2"));
}
}
为什么A句写成List<Object> = new LinkedList<Object>();后就无法通过编译了?为什么?
我是JDK1.6的呀
作者:
高照
时间:
2012-10-5 00:08
以下是个人见解,不知对不对:
java1.4之前是不支持泛型的,List l = new LinkedList();
这句话没用到泛型,java1.5为了兼容以前版本允许Collections.sort(List l);
但是List<Object> = new LinkedList<Object>();用到了泛型,如果想调用sort方法
需要用以下方法
static <T extends Comparable<? super T>> void sort(List<T> list)
或
static <T> void sort(List<T> list, Comparator<? super T> c)
但是Object没有实现比较器Comparable,所以会有错误。
作者:
怪盗急得
时间:
2012-10-5 00:22
本帖最后由 陈德基 于 2012-10-5 00:28 编辑
报错的原因是因为这个,<T extends Comparable<? super T>>。
T extends Comparable 这个代表的一种继承关系,意思是要让某种类型的对象具备比较性。
让某个对象具备比较性主要是复写compareTo( )方法
但是,你定义的是Object类型,那么打个比方,我们要对比的是狗这种动物,但是你定义的泛型可以让狗和猪进行比较,这个不合理。
所以定义Object是错误的。
作者:
谭立文
时间:
2012-10-5 07:25
说说遇到这种问题的解决办法,不变应万变
1.
先查查API看看Collections类中的sort方法的使用规则。
2.
以下是其用法,摘自API
根据元素的自然顺序 对指定列表按升序进行排序。
列表中的所有元素都必须实现 Comparable 接口
。此外,列表中的所有元素都必须是可相互比较的(也就是说,对于列表中的任何 e1 和 e2 元素,e1.compareTo(e2) 不得抛出 ClassCastException)。
3.API中说列表中的所有元素都
必须实现Comparable接口
4.
那再看看Object有没有实现这个接口
public class Object
其实Object是没有实现这个接口的,如果你不是很清楚查查API中对类的定义。
5
.自己再总结看看,为什么没sun公司没有帮你实现这个接口,因为Object是一个很抽象的东西,你根本没办法来确定其排序比较规则,比如说Person这个类,你是按姓名的长短,身高,还是年龄的大小?这些都可以作为比较的规则,所以说当你想要某个类具有可比较性时,得你自己去实现。这样就比较清楚了,学知识都是这样的一个过程。
希望对你有帮助。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2