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

发布于 2024-07-27 15:56:29 字数 434 浏览 6 评论 0原文

考虑这段代码:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不必了 2024-08-03 15:56:29

您的类实现了 Comparator 而不是 Comparable

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

Your class implements Comparator<jm45> instead of Comparable<jm45>.

A Comparator knows how to compare two objects - a Comparable 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:

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;
    }
}

And here's a version which uses the Comparator interface:

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());
    }
}

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.

梦亿 2024-08-03 15:56:29

来自 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文