Java 为什么这段代码抛出ClassCastException以及如何避免它

Java 为什么这段代码抛出ClassCastException以及如何避免它,java,classcastexception,Java,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)); l

考虑以下代码:

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;
   }
}
import java.util.*;
类jm45实现了比较器
{
私人INTX;
jm45(int输入){x=input;}
公共静态void main(字符串参数[])
{
列表=新的ArrayList();
增加(新jm45(2));
增加(新jm45(2));
Collections.sort(list);//错误行
}
公共整数比较(jm45 t1,jm45 t2)
{
返回t1.x-t2.x;
}
}

您的类实现了
Comparator
而不是
Comparable

比较器
知道如何比较两个对象-可比较的
比较器
知道如何将另一个对象与自身进行比较

您需要为
sort()
传入一个比较器才能使用(作为第二个参数),或者这些值必须具有可比性

这是一个使用
可比
界面的版本:

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
,但是这样做有点奇怪。例如,您通常不会要求一个字符串相互比较另两个字符串-这与原始字符串本身无关。

来自Collections.sort javaDoc:

根据 元素的自然顺序列表中的所有元素都必须 实现可比较的界面。此外,所有要素 列表中的数据必须相互可比(即, e1.compareTo(e2)不能抛出ClassCastException 对于列表中的任何元素e1和e2)。


您的类实现了Comparator,而不是Comparable。

当您遇到该异常时,您不知道强制转换的目标类型是什么吗?“jm45”在我看来不是一个有效的Java类名:)“jm45”是一个合法的类名,只是看起来不像。顺便说一句:如果整个程序都是用泛型编写的,编译时警告将被错误替换。
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());
    }
}