2011-09-26 4 views
2

메서드 인수로 사용할 매개 변수화 된 Class 객체를 얻으려면 어떻게해야합니까?Generics : 매개 변수화 된 클래스 인수 만들기

class A<T> 
{ 
    public A(Class<T> c) 
    { 
    } 

    void main() 
    { 
     A<String> a1 = new A<String>(String.class);  // OK 
     A<List<String>> a2 = new A<List<String>>(List<String>.class); // error 
     A<List<String>> a3 = new A<List<String>>(Class<List<String>>); // error 
    } 
} 

가 왜 그렇게 싶어, 당신은 요청할 수 있습니다? 다른 매개 변수화 된 클래스가있는 매개 변수화 된 클래스가 있고 해당 생성자가 다른 클래스 형식을 인수로 요구합니다. 런타임 클래스에는 형식 매개 변수에 대한 정보가 없지만 컴파일 타임에이 작업을 수행하지 않아야합니다. 그것은 List<String>.class과 같은 타입을 지정할 수 있어야합니다. 이 작업을 수행하는 또 다른 구문이 있습니까?

public class Bunch<B> 
{ 
    Class<B> type; 

    public Bunch(Class<B> type) 
    { 
     this.type = type; 
    } 

    public static class MyBunch<M> extends Bunch<List<M>> 
    { 
     Class<M> individualType; 

     // This constructor has redundant information. 
     public MyBunch(Class<M> individualType, Class<List<M>> listType) 
     { 
      super(listType); 
      this.individualType = individualType; 
     } 

     // I would prefer this constructor. 
     public MyBunch(Class<M> individualType) 
     { 
      super(/* What do I put here? */); 
      this.individualType = individualType; 
     } 
    } 
} 

가 어떻게이게 가능 : 여기

내 실제 사용 사례입니까?

+1

Google Gson의 'TypeToken'http : //google-gson.googlecode를 보라. co.kr/svn/trunk/gson/docs/javadocs/co.kr/google/gson/reflect/TypeToken.html을 참조하십시오. 그것은 오픈 소스이며 당신이 가진 것과 같은 문제를 해결합니다. – BalusC

+0

가능한 [Java 일반 함수 : 일반 유형을 반환하는 방법] (http://stackoverflow.com/questions/1959022/java-generic-function-how-to-return-generic-type) – BalusC

+0

감사합니다, BalusC. 첫째, 나는 단순한 것을 놓치지 않는다고 안심이됩니다.그러나 ** ** ** ** ** ** ** ** ** ** ** ** 응용 프로그램에서 ** Type ** s를 다루는 것이 어려워 보였으므로이 문제를 해결할 준비가되지 않았습니다. –

답변

0

캐스팅은 어떨까요?

super((Class<List<M>>)List.class); 

클래스 리터럴에는 원하는 유형 매개 변수가 없습니다.

0

런타임시 클래스로 목록을 가져 오지 않을 것이라는 사실을 기억하십시오. 올바른 접근법은 BalusC에서 말한대로 TypeToken을 사용했을 것입니다. TypeToken없이, 당신은 목록으로 캐스팅 할 수는 없지만 이런 식으로 뭔가를 만들 수 있습니다 당신이 원하는 수 있으므로이 형태 보증으로하지 않습니다

public static class MyBunch2<List_M extends List<M>, M> extends Bunch<List_M> 
{ 
    Class<M> individualType; 

    @SuppressWarnings("unchecked") 
     public MyBunch2(Class<M> individualType) 
    { 
     super((Class<List_M>) List.class); 
     this.individualType = individualType; 
    } 
} 

List_M extends List<M> 때문에,하지만 어쩌면 충분히 좋다. 인스턴스를 만들기 쓰기

MyBunch2<List<String>, String> a = new MyBunch2<List<String>, String>(String.class); 

만큼 추한하지만 당신은 이클립스를 사용하는 경우

public static <M2> MyBunch2<List<M2>, M2> of(Class<M2> individualType){ 
    return new MyBunch2<List<M2>, M2>(individualType); 
} 

다음은

MyBunch2<List<String>, String> b = MyBunch2.of(String.class); 

쓰기 공장 방법을 향상시킬 수, 코드 지원 못생긴 클래스를 작성하는 데 도움이됩니다. MyBunch2, String>

물론 런타임에 this.ty pe는 java.util.List가 아니고 java.util.List가됩니다. 오른쪽으로 이동하려면 TypeToken으로 이동하십시오.

심지어 다른 클래스에게

public static class MyBunch3<M> extends MyBunch2<List<M>, M> 
{ 
     public MyBunch3(Class<M> individualType) { 
      super(individualType); 
     } 
} 

을 확인하고

MyBunch3<String> c = new MyBunch3<String>(String.class); 

로 인스턴스를 생성 그냥 것을 할 수있는 방법이 있어야합니다 수

--- 계속 --- 하나의 클래스 ... 그러나 나는 그것을 알아낼 수 없다.

관련 문제