なぜ、このコードは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
は、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を実装しています。
所属していません StackOverflow