문제 요약 : 형식 매개 변수 (예 : ArrayList<SomeClass>
)가있는 클래스를 형식 매개 변수로 일반 메서드에 전달하고 싶습니다. .Java의 제네릭 메서드에 대한 형식 매개 변수로 형식 매개 변수로 전달하는 클래스
의 내가 방법을 가지고 있다고 가정 해 봅시다 :
public static <T> T getGenericObjectFromJson(String json, Class<T> genericType){
// details unimportant, basically returns an object of specified type
return JsonParser.fromJson(json, genericType);
}
이 방법은 물론, 클래스의 모든 종류의 완벽하게 잘 작동합니다. 나는 예를 들어,과 같이 메소드를 호출 할 수 있습니다
getGenericObjectFromJson(jsonString, User.class)
문제 :는 내가이 작업을 수행 할 수 없습니다 발견 :
이getGenericObjectFromJson(jsonString, ArrayList<User>.class)
구문 적이 분명히 유효하지 않습니다. 그러나, 나는 이런 식으로 어떻게 성취 할 것인가를 확신하지 못한다. 물론 ArrayList.class
을 전달할 수 있지만 제네릭 형식을 추가하면 더 이상 구문 론적으로 유효하지 않으며 그 주위를 생각할 수 없습니다.
유일한 직접 솔루션 (오히려 바보 같다) 이런 일을하고있다 :
getGenericObjectFromJson(jsonString, new ArrayList<User>().getClass())
그러나 우리는 어쨌든 제네릭 형식을 잃고 결국, 단순히 다시 알 수없는 유형의 ArrayList를을 (그것은 할 수 있지만 얻을 던지다). 게다가 불필요하게 객체를 인스턴스화합니다.
내 유일한 해결책은 지금까지과 같이, 인스턴스화 할 수있는 일반적인 형식 매개 변수가 포함 된 클래스에서 그 방법을 포장하고있다 :이 경우
public class JsonDeserializer<T>...
을의 getGenericObjectFromJson
방법은 클래스의 사용 제네릭 유형.
질문 : 궁금한 점은 궁금한 점은 왜 형식 매개 변수를 사용하여 클래스를 전달할 수 없는지와 내가 시도한 것을 성취 할 수있는 방법이 있는지 궁금합니다.
언제나이 질문에 문제가 있는지 알려 주시기 바랍니다.
유형 삭제로 인해 가능하지 않다고 생각합니다. Java 제네릭은 컴파일 타임 구조이며 런타임에는 존재하지 않으므로 생성 된 제네릭 형식을 나타내는'Class' 객체는 없습니다. – cdhowie
해결책 :'C#', 농담하지 마라. 컴파일 할 때 java가 수행하는 "type erasure"로 인해 일반 유형 정보를 제거 할 수 없습니다. –
이것을'getGenericArrayListFromJson (jsonString, User.class)'로 재 작성하려고합니까? 이것은 아마도 당신이 할 수있는 최선의 방법 일 것입니다. –