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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙新强 中级黑马   /  2012-7-11 14:36  /  1429 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面是两个类:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;


public class PersonWithCollection {

public static void print(Object o){
  System.out.println(o);
}

public static void main(String[] args){
  List<Person> arrayPerson = new ArrayList<Person>();
  List<Person> linkedPerson = new LinkedList<Person>();
  Set<Person> setPerson = new TreeSet<Person>();
  for(int i = 0;i<3;i++){
   arrayPerson.add(new Person());
   linkedPerson.add(new Person());
   setPerson.add(new Person());//这里会出现错误
  }
  
  print(arrayPerson);
  print(linkedPerson);
  print(setPerson);
  
  List<String> arrayString = new ArrayList<String>();
  List<String> linkedString = new LinkedList<String>();
  arrayString.add("1");
  arrayString.add("2");
  arrayString.add("3");
  arrayString.add("4");
  
  linkedString.add("1");
  linkedString.add("2");
  linkedString.add("3");
  linkedString.add("4");
}
}
//************Person类*************

public class Person{
private static long counter = 0;
private final long id = counter++;
public long getId(){
  return id;
}

public String toString(){
  return super.toString()+" "+id;
}
public boolean equals(Object obj){
  if(obj instanceof Person){
   Person p = (Person)obj;
   if(this.getId() == p.getId()){
    return true;
   }
  }
  return super.equals(obj);
}
public int hashCode(){
  return String.valueOf(id).hashCode();
}
}

为什么会报如下错误:
Exception in thread "main" java.lang.ClassCastException: Person cannot be cast to java.lang.Comparable
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at PersonWithCollection.main(PersonWithCollection.java:21)

2 个回复

倒序浏览
TreeSet是一个有序的集合
所以创造一个Person类的TreeSet必须自己指定怎么去比较Person对象:
在构造TreeSet时传递一个Comparator对象
或者让Person类实现Comparable接口,覆盖compareTo方法
回复 使用道具 举报
public class Person{
private static long counter = 0;
private long id = counter++;//这里错了,不能用final修饰
public long getId(){
  return id;
}

public String toString(){
  return super.toString()+" "+id;
}
public boolean equals(Object obj){
  if(obj instanceof Person){
   Person p = (Person)obj;//这里错了,这个叫做类型转换异常,不能将人转换成人
   if(this.getId() == p.getId()){
    return true;
   }
  }
  return super.equals(obj);
}
public int hashCode(){
  return String.valueOf(id).hashCode();
}
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马