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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邱成 中级黑马   /  2012-10-4 23:20  /  2748 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邱成 于 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的呀

评分

参与人数 1技术分 +1 收起 理由
王海宇 + 1

查看全部评分

4 个回复

倒序浏览
以下是个人见解,不知对不对:
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,所以会有错误。

评分

参与人数 1技术分 +1 收起 理由
王海宇 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 陈德基 于 2012-10-5 00:28 编辑

报错的原因是因为这个,<T extends Comparable<? super T>>。
T extends Comparable 这个代表的一种继承关系,意思是要让某种类型的对象具备比较性。
让某个对象具备比较性主要是复写compareTo( )方法
但是,你定义的是Object类型,那么打个比方,我们要对比的是狗这种动物,但是你定义的泛型可以让狗和猪进行比较,这个不合理。
所以定义Object是错误的。

评分

参与人数 1技术分 +1 收起 理由
王海宇 + 1

查看全部评分

回复 使用道具 举报
说说遇到这种问题的解决办法,不变应万变
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这个类,你是按姓名的长短,身高,还是年龄的大小?这些都可以作为比较的规则,所以说当你想要某个类具有可比较性时,得你自己去实现。这样就比较清楚了,学知识都是这样的一个过程。
希望对你有帮助。

评分

参与人数 1技术分 +1 收起 理由
王海宇 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马