2012-10-28 3 views
2

다른 일반적인 Java 제네릭 질문을 보았습니다. 여전히 혼란 스럽습니다. WeightedThing<T>이 (단지 어떤 임의의 유형에 가중치를 추가)하고 WeightedVector가 (아니, WeightedVector 그냥 WeightedThing<Vector>되지 않습니다)있는 사용자 정의 Vector 클래스 서브 클래스는 다음과 같습니다 중첩 된 제네릭을 사용하는 변환 할 수없는 유형

나는 다음 클래스 계층 구조를 가지고있다.

가장 가까운 이웃 검색을 수행하고 주어진 쿼리 벡터 및 해당 거리에 가장 가까운 벡터 목록을 반환하고 싶습니다.

public List<WeightedThing<? extends Vector>> search(Vector, int limit) {...} 

내가

List<WeightedThing<WeightedVector>> neighbors = (List<WeightedThing<WeightedVector>>)search(query, 1); 

는 IntelliJ를 오류로 표시하지 않습니다 (작동하지 않습니다 할 수있는 희망하지만, 썬의 jdk7u10로 컴파일이 들어, 나는 search 방법을 정의 Mac OS X이 실패 함). Vector과 동일한 기능을 호출하지도 않습니다. Object에 업 캐스트를 추가하여 컴파일하도록 강제 할 수 있지만 이는 끔찍한 것처럼 보입니다.

목적은 모든 유형의 벡터를 검색하고 추가 할 수 있지만 WeightedVectors 만 추가 한 경우 결과를 다시 WeightedVectors로 캐스팅하려고합니다.

+0

이 정보가 유용할까요? http://stackoverflow.com/questions/2522155/java-generics-parameters-with-base-of-the-generic-parameter – INS

+0

제안 해 주셔서 감사합니다. 그러나 정말로, 아래 Ale E의 답변에 대한 내 의견을 참조하십시오. –

답변

0

WeightedThing<? extends Vector> 목록은 WeightedThing<WeightedVector> 목록과 동일하지 않습니다. 유형 변환을 수행하려면 any collection 인 야생 char 유형으로 변환 한 다음 특정 유형으로 변환하십시오.

List<WeightedThing<WeightedVector>> neighbors = (List<WeightedThing<WeightedVector>>) 
               (List<?>)search(query, 1); 
+0

해답이 전혀 만족스럽지 않지만 자바 덕분입니다. :) –

3

일반적으로 메소드의 반환 유형에 야생 문자 유형을 사용하는 것은 좋지 않습니다. 메소드 서명을 다음과 같이 변경하지 마십시오.

public <T extends Vector> List<WeightedThing<T>> search(T vector, int limit) {...} 
+0

내가 원하는 것은'search '를'Vector'로 호출 할 수 있지만'added'를 호출 할 때'WeightedVector'를 추가했기 때문에'WeightedThing '의 목록을 얻을 수 있다는 것만 큼 효과가 있습니다. . 나는 이것이 잘못된 타입을 야기 할 수 있다는 것을 알고 있지만, 컴파일러는 내가 올바른 일을하고 있다는 것을 저에게 믿어주고 싶습니다. –

관련 문제