黑马程序员技术交流社区
标题:
关于泛型限定的疑问
[打印本页]
作者:
黑马-王燚
时间:
2012-10-3 01:42
标题:
关于泛型限定的疑问
import java.util.*;
public class GenericDemo3 {
/**
* @param args
*/
public static void main(String[] args)
{
// TODO 自动生成的方法存根
TreeSet<Student_Human> t=new TreeSet<Student_Human>( /*new Comp()*/ );
t.add(new Student_Human("abc01"));
t.add(new Student_Human("abc02"));
t.add(new Student_Human("abc07"));
t.add(new Student_Human("abc03"));
t.add(new Student_Human("abc04"));
Iterator<Student_Human> it=t.iterator();
while(it.hasNext())
{
System.out.println(it.next().getName());
}
}
}
class Comp implements Comparator<Student_Human>
{
@Override
public int compare(Student_Human s1, Student_Human s2)
{
return s1.getName().compareTo(s2.getName()); //升序排序(按ASCII码从低到高)
}
}
我想问的是 为什么这里把new Comp()比较器去掉 就会报错呢,报的错误是
Exception in thread "main" java.lang.ClassCastException: com.CollectionDemo.Student_Human cannot be cast to java.lang.Comparable
作者:
黄小贝
时间:
2012-10-3 02:21
本帖最后由 黄小贝 于 2012-10-3 02:29 编辑
目测你的Student_Human没有实现Comparable接口,TreeSet的add方法调用了TreeMap的put方法
如果比较器为null ,则插入的元素需要实现
Comparable
接口,所以~你要么传一个比较器进去,要么实现
Comparable
接口~
public V put(K key, V value) {
Entry<K,V> t = root;
if (t == null) {
// TBD:
// 5045147: (coll) Adding null to an empty TreeSet should
// throw NullPointerException
//
// compare(key, key); // type check
root = new Entry<K,V>(key, value, null);
size = 1;
modCount++;
return null;
}
int cmp;
Entry<K,V> parent;
// split comparator and comparable paths
Comparator<? super K> cpr = comparator;
if (cpr != null) {
do {
parent = t;
cmp = cpr.compare(key, t.key);
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else
return t.setValue(value);
} while (t != null);
}
else {
if (key == null)
throw new NullPointerException();
Comparable<? super K> k = (Comparable<? super K>) key;
do {
parent = t;
cmp = k.compareTo(t.key);
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else
return t.setValue(value);
} while (t != null);
}
Entry<K,V> e = new Entry<K,V>(key, value, parent);
if (cmp < 0)
parent.left = e;
else
parent.right = e;
fixAfterInsertion(e);
size++;
modCount++;
return null;
}
复制代码
作者:
佘天宇
时间:
2012-10-3 20:15
TreeSet集合会对存入的元素排序,要求存入的元素本身具备比较性,这时候存入的元素要么本身实现了Comprable
接口Comprable强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序
复写接口中的compareTO()方法,按照指定方式进行排序,
如果元素不具备比较性,就是说没有实现Comparable接口,这时候需要让集合容器自身具备比较性
当两种排序都存在的时候,以比较器Comparator为主
你上面的自定义对象类并没有实现Comparable接口,不具备比较性
如果这时候不传入比较器,肯定是不可以的
存入一个元素没问题,接着存入的时候编译没有问题,但是运行的时候出异常,ClassCastException,类型转换异常。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2