为什么这段代码会抛出 ClassCastException 以及如何避免它
考虑这段代码:
import java.util.*;
class jm45 implements Comparator<jm45>
{
private int x;
jm45(int input) { x = input; }
public static void main( String args[] )
{
List list = new ArrayList();
list.add(new jm45(2));
list.add(new jm45(2));
Collections.sort(list); //faulty line
}
public int compare( jm45 t1 , jm45 t2 )
{
return t1.x - t2.x;
}
}
Consider this code:
import java.util.*;
class jm45 implements Comparator<jm45>
{
private int x;
jm45(int input) { x = input; }
public static void main( String args[] )
{
List list = new ArrayList();
list.add(new jm45(2));
list.add(new jm45(2));
Collections.sort(list); //faulty line
}
public int compare( jm45 t1 , jm45 t2 )
{
return t1.x - t2.x;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您的类实现了
Comparator
而不是Comparable
。Comparator
知道如何比较两个对象 -Comparable
知道如何将另一个对象与其自身进行比较。您要么需要传入一个比较器供
sort()
使用(作为第二个参数),要么这些值必须具有可比性。这是一个使用
Comparable
接口的版本:这是一个使用
Comparator
接口的版本:没有什么可以阻止一个实现
的类>Comparator
本身,但这样做有点奇怪。 例如,您通常不会要求一个字符串相互比较另外两个字符串 - 它与原始字符串本身无关。Your class implements
Comparator<jm45>
instead ofComparable<jm45>
.A
Comparator
knows how to compare two objects - aComparable
knows how to compare another with itself.You either need to pass in a comparator for
sort()
to use (as the second argument) or the values have to be comparable.Here's a version which uses the
Comparable
interface instead:And here's a version which uses the
Comparator
interface:There's nothing to stop a class implementing
Comparator<T>
for itself, but it's a little strange for it to do so. For instance, you wouldn't normally ask one string to compare two other ones with each other - it's got nothing to do with the original string itself.来自 Collections.sort javaDoc:
根据
其元素的自然顺序。 列表中的所有元素都必须
实现Comparable接口。 此外,所有元素
列表中的内容必须相互可比较(即
e1.compareTo(e2) 不得抛出 ClassCastException
对于列表中的任何元素 e1 和 e2)。
您的类实现了 Comparator,而不是 Comparable。
From the Collections.sort javaDoc:
Sorts the specified list into ascending order, according to the
natural ordering of its elements. All elements in the list must
implement the Comparable interface. Furthermore, all elements
in the list must be mutually comparable (that is,
e1.compareTo(e2) must not throw a ClassCastException
for any elements e1 and e2 in the list).
Your class implements Comparator, not Comparable.