黑马程序员技术交流社区

标题: 小程序求助 [打印本页]

作者: 孙新强    时间: 2012-7-11 14:36
标题: 小程序求助
下面是两个类:

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)

作者: 温少邦    时间: 2012-7-11 16:27
TreeSet是一个有序的集合
所以创造一个Person类的TreeSet必须自己指定怎么去比较Person对象:
在构造TreeSet时传递一个Comparator对象
或者让Person类实现Comparable接口,覆盖compareTo方法
作者: 全海波    时间: 2012-7-11 16:37
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();
}
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2