2013-04-24 2 views
1

비교 인터페이스에 의해 생성 된 캐스트 오류 방지하는 방법 :내가 자바의 제네릭 클래스가

public class PriorityList<T extends Number> implements Comparable<T> { 


    T[] array = (T[]) new Object[10]; 

을 그리고 오류를 가지고

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Number; 

Erorr이 주조로 만들 것입니다 (T []) new Object [10].

배열 요소를 정렬해야하기 때문에 비교 방법이 필요합니다. 그래서이 클래스를 선언 할 수 없습니다.

public class PriorityList<T extends Number> 

기타 옵션은 T 값을 유지하는 자체 링크 목록에 의해 만들어집니다. 그러나이 주조 문제를 해결하는 또 다른 방법은

(T []) new Object [10];

?

PS 컬렉션은 사용하기에 적합합니다.

+1

@RonDahlgren 말하기를 불필요한 캐스트를 버리고 캐스팅해야하는 오래된 Java 책 (Java 1.1)이 있습니다. 참조에 저장하고 참조를 가져 오는 것이 캐스팅보다 시간이 덜 걸리기 때문입니다. – gparyani

+1

배열, 제네릭 및 형식 안전 : 두 개만 선택할 수 있습니다. –

+0

@gparyani 좋은 지적. 그의 컬렉션의 사용 패턴에 따라 머리에 이미 주조 된 참조를 유지하는 것이 합리적 일 수도 있습니다 –

답변

0

의 배열을 배열 Number으로 캐스팅 할 수 없습니다. Object 배열에는 T 유형뿐만 아니라 모든 유형의 객체를 포함 할 수 있기 때문입니다. 그러나 new T[]은 유형 오류로 인해 올바르지 않습니다. 즉 Java 런타임은 T에 대해 알지 못합니다.

한 가지 방법은 aObject[] 배열로 만드는 것입니다.

public PriorityList(Class<T> type) { 
    T[] a = (T[])Array.newInstance(type, 10); 
} 

또는 언급 한 바와 같이 - 자바 컬렉션을 사용 - 그들은 더 일반적인 친화적 :

또 다른 방법이다.

+0

post scriptum을보십시오. – Aku

+0

좋습니다,'Array.newInstance'는 당신을 필요로합니다. 나는 얼마 전에 업데이트를하고 있습니다. 바로 확인해보세요. – acc15

0

예약 된 배열을 알 수없는 형식의 배열로 캐스트 할 수 없습니다. 이 방법으로 T 객체에 대한 배열 팩토리를 사용하는 것이 좋습니다.

public interface ArrayFactory<T extends Number> { 
    T[] create(int size); 
} 

public class PriorityList<T extends Number> implements Comparable<T> { 

    private ArrayFactory<T> factory=...; 
    T[] array = factory.create(10); 

그런 다음 ArrayFactory의 구현을 PriorityList에 제공 할 수 있습니다.

희망이 도움이됩니다.

0

는 객체이지만, java.util.Arrays에서이 방법은 당신이 원하는 로직을 포함하는 수

아닌 객체. 그것은

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) { 
     T[] copy = ((Object)newType == (Object)Object[].class) 
      ? (T[]) new Object[newLength] 
      : (T[]) Array.newInstance(newType.getComponentType(), newLength); 
     System.arraycopy(original, 0, copy, 0, 
         Math.min(original.length, newLength)); 
     return copy; 
    } 
0

단순히

T[] array = (T[]) new Comparable[10]; 

T 이후 's의 하한 T[]에 캐스팅 실제로 Comparable[]에 캐스트가 발생, Comparable 인으로 변경 T 타입의 배열을 만들 수 있습니다. Object[]이 (가) Comparable[] (으)로 변환되지 않았으므로 실패한 것으로 표시됩니다.

0

T의 삭제는 그래서 수 있습니다 :

Number[] array = new Number[10]; 

당신은 충분히 가까이됩니다. 해당 배열에 Number의 하위 클래스 (예 : T)를 저장해도됩니다. (주 : 으로 캐스팅 한 이유가 예외 인 이유에 대해서도 설명해야합니다.

관련 문제