이 코드가 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 :
요소의 자연 순서에 따라 지정된 목록을 오름차순 순서로 정렬합니다. 목록의 모든 요소는 비슷한 인터페이스를 구현해야합니다.. 또한 목록의 모든 요소는 있어야합니다 상호 비교할 수 있습니다 (즉, e1.compareto (e2)는 목록에있는 요소 E1 및 E2에 대해 ClassCastException을 던져서는 안됩니다).
클래스는 비교할 수없는 비교기를 구현합니다.
제휴하지 않습니다 StackOverflow