2011-11-06 576 views
1

我正在爲C++編寫一個Java包裝器,並且想使用泛型類來包裝C++模板。因此,我想獲得泛型類型作爲字符串,所以我可以進一步傳遞給JNI並實例化一個相應的C++對象。Java:獲得泛型類型

編輯:這是我如何實現它,如果有人感興趣:

public class A<T> 
{ 
    private long ptr; 

     public static <E> A<E> create(Class<E> cls) 
     { 
      return new A<E>(cls); 
     } 

    private A(Class<T> cls) 
    { 
     ptr = create(cls.getName()); 

     if(ptr == 0) 
     { 
      throw new NullPointerException(); 
     } 
    } 

    private native long create(String className); 
} 
+0

問題是......? – home

+0

好吧,我該怎麼做?我不能簡單地寫出T.getClass()。toString() – Pedro

回答

4

Java泛型不保留任何類型的信息過去的編譯時間,由於type erasure。您需要將T的課程實例傳遞給您的A課程:

public class A<T> 
{ 
    private Class<T> type; 
    private long ptr; 

    public class A(Class<T> type) 
    { 
     this.type = type; 
     ptr = create(getGenericType()); 

     if(ptr == 0) 
     { 
      throw new NullPointerException(); 
     } 
    } 

    private String getGenericType() 
    { 
     return type.getName(); 
    } 

    private native long create(String className); 
} 
+0

最終代碼不僅僅由我自己使用,所以我正在尋找更優雅的解決方案。 Instantianting objects like this:A a = new A (String.class);不是非常用戶友好的。 – Pedro

+4

@Pedro a)Java泛型被設計成這樣,我們無能爲力。 b)你可以通過使用靜態工廠方法來改進代碼:'A a = A.ofType(String.class)' –

+1

@Sean - 工廠方法是一個很好的建議。 –