2009-08-05 5 views
8

당신이 서명하는 방법이있는 경우 :자바 generized 클래스 참조

Class<? extends List<String>> getObjectType() 
{ 
     return ?????; 
} 

가 어떻게 List 클래스의 적절한 일반 버전을 반환 할를?

return List.class; //errors 
return List<String>.class; //errors 
return List.class<String>; //errors 

이 문제를 처리하는 올바른 구문은 무엇입니까?

답변

9

명시 적으로 반환 유형으로 캐스팅해야합니다. 작동 방식 :

return (Class<? extends List<String>>) List.class; 

예 그냥 잘못되었습니다. 이것은 Java generics 시스템이 엉망인 이유 중 하나 일뿐입니다.

+0

흥미 귀하의 제안을하는 것은 더 가까이 저를 가져옵니다. 하지만 Java 컴파일러를 사용하여 클래스를 컴파일 할 때 "inconvertible types found : java.lang.Class 가 필요합니다 : java.lang.Class > " –

+0

이상하게도, 이클립스 내에서 작동하지만 커맨드 라인에서 컴파일 할 때는 그렇지 않습니다. 나는 전에 그것을 본 적이 없다. –

+0

-nowarn 옵션을 사용하면 someList.getClass()를 반환하는 경우에도 작동하지만 List.class로 시도 할 때 표시되는 것과 동일한 오류가 발생합니다. –

2

List<String>까지 확장되는 수업을 반납해야합니다. ArrayList<String>은 한 예입니다. 당신이 시도 할 수 :

ArrayList<String> myList = new ArrayList<String>(); 
... 
return (Class<? extends List<String>>)myList.getClass(); 
+1

명시 적 형변환이 필요합니다. 일반적인 getClass 메소드는 클래스 클래스를 반환합니다. –

+0

@ 존 : 지적 해 주셔서 고맙습니다. 나는 점검했다. 그리고 그것은 정말로 사실이다. 캐스트를 포함하도록 예제를 업데이트했습니다. –

5

을 책 "효과적인 자바"(2 판, 137 페이지)에서 "반환 형식으로 와일드 카드 형식을 사용하지 마십시오 오히려 사용자를위한 유연성을 제공하는 대신, 그것은 그들을 강제 것입니다. 클라이언트 코드에서 와일드 카드 유형을 사용하십시오. " 캐스팅

말했다

는 먼저 임시 변수를 만들어야합니다

@SuppressWarnings("unchecked") 
Class<? extends List<String>> result = ....; 
return result; 

당신이 과제에 주석을 가질 수 있기 때문에이 작동합니다. return 자체에서는 작동하지 않습니다. 메서드에 추가 할 수도 있지만 다른 문제도 숨길 수 있습니다.

+1

나를 위해 그것은 단지 경고하지 않았다. 실제로 캐스트를 추가 할 때까지 실제로 컴파일 오류가 발생했다. –

+0

수정하십시오. "List"와 "List <...>"은 String과 Integer와 완전히 다른 유형이므로 캐스트가 필요합니다. 그러나 캐스트가 경고를 유발할 것이므로이를 억제해야합니다. –

0

List.class 및 목록 < 문자열 > .class -이 모든 경우에 캐스팅이 필요합니다. 정말이 같은 somethig에, 런타임에 목록 < 문자열 >이있는 유형을 필요 일식 불평 중지로

interface StringList extends List<String> {}; 

public Class<? extends List<String>> getObjectType() { 
    return StringList.class; 
}