ComparableStudent无法强制转换为java.lang.Comparable

时间:2015-05-28 07:37:17

标签: java generic-collections

此程序在没有引号的情况下正常工作(即通过实现Comparable接口)。 所以只是想看看Set是否会使用字段和打印的普通对象,然后我看到这个错误。

Exception in thread "main" java.lang.ClassCastException: GenericColl.ComparableStudent cannot be cast to java.lang.Comparable
    at java.util.TreeMap.compare(TreeMap.java:1290)
    at java.util.TreeMap.put(TreeMap.java:538)
    at java.util.TreeSet.add(TreeSet.java:255)
    at GenericColl.ComparableStudent.main(ComparableStudent.java:42)
Java Result: 1

`package GenericColl;

import java.util.Set; import java.util.TreeSet;

public class ComparableStudent /*implements Comparable */ {

private String name; private long id; private double gpa; @Override public String toString() { return "name=" + name + ", id=" + id + ", gpa=" + gpa; } public ComparableStudent(String name, long id, double gpa) { this.name = name; this.id = id; this.gpa = gpa; } /* public String getName() { return this.name; } @Override public int compareTo(ComparableStudent s) { int result = this.name.compareTo(s.getName()); if (result > 0) { return 1; } else if (result < 0) { return -1; } else { return 0; } }*/ public static void main(String... args) { Set<ComparableStudent> Stu = new TreeSet<>(); Stu.add(new ComparableStudent("Catalina", 324, 5.6)); Stu.add(new ComparableStudent("Pauline", 373, 4.4)); Stu.add(new ComparableStudent("Arica", 322, 6.6)); Stu.stream().forEach((c) -> { System.out.println(c); }); } }`

1 个答案:

答案 0 :(得分:1)

TreeSet是一个有序的Set,这意味着为了对对象进行排序,需要Comparable接口。 TreeSet自动调用compareTo以了解在集合中添加新对象的位置。

检查TreeSet类的API文档http://docs.oracle.com/javase/7/docs/api/