2011-03-10 3 views
3

은 내가유형의 안전 : 체크되지 않은 캐스트 및 제네릭

public T[] values(){ 
    return (T[])map.values().toArray(); 
} 

그리고 분명히, 내가 체크되지 않은 캐스트로 끝나는있어 다음과 같은 방법을 정의하고자

private Map<String,T> map = Collections.synchronizedSortedMap(new TreeMap<String,T>()); 

매우 간단한지도를 가지고 문제는 ... 내 문제는 toArray(new T[size])을 호출 할 수 없다는 것입니다.

나는

감사 (@SuppressedWarning를 사용하여 wihtout)이 경고를 방지하기 위해 무엇을해야

+0

왜 toArray (new T [size])를 호출 할 수 없습니까? ?? – Zimbabao

+0

toArray (new T [0]) – Zimbabao

+1

Java에서 T => 코드가 컴파일되지 않는 일반적인 배열을 만들 수 없습니다. – BlackLabrador

답변

0

내가 생각할 수있는 가장 좋은 타입 T의 배열을 (수락 할 클래스의 생성자를 만드는 것입니다 즉 T [] 인수). 클래스 사용자는 크기가 0 인 배열을 제공해야합니다. 그런 다음이 배열을 사용하여 toArray (T []) 호출을 만들 수 있습니다.

+0

동일한 unchecked 캐스트 예외로 실행하지 않고 클래스 인스턴스에서 크기가 0 인 배열을 만드는 방법이없는 것 같아 사용자가 생성자에서 T.class 개체를 제공 할 수있는 방법을 찾지 못했습니다. – necromancer

+0

Array.newInstance()를 사용하여 리플렉션을 사용하여 배열을 구성 할 수 있습니다. 물론, 경고 메시지가 계속 나타납니다. 클래스 캐스팅 예외로 인해 충돌하지는 않습니다. – newacct

4

배열을 피하십시오. List<T>을 반환하십시오.

배열은 필수적인 기본 구성 요소이지만 형식 시스템에서는 매우 이상합니다. API에서이를 피하는 것이 좋습니다. 거의 모든 배열을 ArrayList로 대체 할 수 있습니다. 성능은 동일합니다.

+0

예, 배열은 문자열과 같습니다. 때로는 프리미티브처럼 취급되며 때로는 컬렉션으로 취급되기도합니다. 실제 컬렉션으로가는 것이 좋습니다. –

0

내가

이 경고는 당신이 걱정해야 할 마지막 일 (@SuppressedWarning를 사용하여 wihtout)이 경고 을 피하기 위해 어떻게해야합니까. 더 큰 문제는 특정 클래스의 배열을 기대하는 사람에게 반환 될 때 ClassCastException으로 충돌 할 것입니다.

Java의 배열은 런타임에 구성 요소 클래스에 대한 참조를 포함하므로 클래스를 모른 채 이러한 배열을 구성 할 수 없습니다. 사용자가 무언가를 전달하면 클래스 T의 클래스 객체를 가져올 수 있습니다. 그렇지 않으면 반환해야합니다. Object[]

0

클래스 객체를 전달해야하는 일반 유형의 배열을 가져 오려면 그렇지 않으면 Object [] 유형의 배열을 반환합니다.

public T[] values(Class<T> cl){ 
    return (T[])map.values().toArray((T[])Array.newInstance(cl,0)); 
} 

이 코드에는 SuppressdWarning을 사용해야하지만 런타임에는 throw되지 않습니다. 또한 collection.values ​​()를 구현해야한다면 ctor에 클래스를 전달해야합니다. 배열과 제네릭은 잘 섞이지 않기 때문에 컬렉션을 선호하는 이유입니다.

관련 문제