2011-11-06 2 views
1

Я пишу оболочку Java для C++ и хотел бы использовать общий класс для переноса шаблона C++. Поэтому я хотел бы получить общий тип как String, чтобы я мог передать его JNI и создать экземпляр соответствующего объекта C++.Java: получить общий тип

EDIT: это, как я реализовал его, в случае, если кто-то интересуется:

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

В конце концов код не используется только мной, поэтому я ищу более элегантное решение. Активация таких объектов: A a = новый A (String.class); не очень удобно. – Pedro

+4

@Pedro a) Java Generics были разработаны таким образом, мы ничего не можем сделать. b) вы можете улучшить код, используя статический заводский метод: 'A a = A.ofType (String.class)' –

+1

@Sean - заводский метод является хорошим предложением. –

Смежные вопросы