なぜ、このコードはClassCastExceptionが投げているし、それを回避する方法

StackOverflow https://stackoverflow.com/questions/1173789

  •  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は、2つのオブジェクトを比較する方法を知っている - Comparableは、それ自体で別のものを比較する方法を知っている。

sort()は(2番目の引数として)使用するためにあなたは、コンパレータに合格する必要がありますいずれか、または値が同等であることが必要があります。

ここでは代わりに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>停止するが、それはそうすることが少し奇妙だことは何もありません。たとえば、あなたは通常、お互いに他の二つのものを比較するために、1つの文字列を聞いていないだろう - それは、元の文字列自体とは何の関係も持っていないです。

他のヒント

Collections.sortのJavaDocから:

によれば、指定されたリストを昇順にソート その要素の自然順序付け。リスト内のすべての要素なければなりません Comparableインタフェースを実装するの。さらに、すべての要素 リストになければなりません。を相互に比較(つまり、 e1.compareTo(E2)はClassCastExceptionがスローすべきではありません リスト内の任意の要素E1およびE2)。

のための

あなたのクラスは、コンパレータ、ないComparableを実装しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top