为什么这个代码投掷一个ClassCastException和如何避免
-
19-09-2019 - |
题
考虑以下代码:
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;
}
}
解决方案
您类实现的,而不是Comparator<jm45>
Comparable<jm45>
。
一个Comparator
知道如何比较两个对象 - 一个Comparable
知道如何与本身比较另一
您要么需要在比较器通过用于sort()
使用(作为第二个参数)或值必须具有可比性。
下面是其使用Comparable
接口而不是一个版本:
import java.util.*;
class Test implements Comparable<Test>
{
private int x;
Test(int input)
{
x = input;
}
public static void main(String args[])
{
List<Test> list = new ArrayList<Test>();
list.add(new Test(2));
list.add(new Test(2));
Collections.sort(list);
}
public int compareTo(Test other)
{
return x - other.x;
}
}
和这里它使用Comparator
接口版本:
import java.util.*;
class TestComparator implements Comparator<Test>
{
public int compare(Test t1, Test t2)
{
return t1.getX() - t2.getX();
}
}
class Test
{
private int x;
Test(int input)
{
x = input;
}
int getX()
{
return x;
}
public static void main(String args[])
{
List<Test> list = new ArrayList<Test>();
list.add(new Test(2));
list.add(new Test(2));
Collections.sort(list, new TestComparator());
}
}
有什么可的停止的一个类实现了自身Comparator<T>
,但它是一个有点奇怪它这样做。举例来说,你通常不会问一个字符串到两个其他的人相互比较 - 它什么都没有做与原始字符串本身
其他提示
从Collections.sort JAVADOC:
对指定列表按升序进行,根据 其元素的自然顺序。的列表中的所有元件必须 实现Comparable接口即可。此外,所有元素 在列表中必须的相互比较的(即, e1.compareTo(e2)不得抛出ClassCastException 对于任何元素e1和e2在列表中)。
您类实现比较器,不具有可比性。
不隶属于 StackOverflow