2011-11-06 126 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 - 工厂方法是一个很好的建议。 –