Java: получение универсального типа

#java #generics

#java #универсальные

Вопрос:

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

РЕДАКТИРОВАТЬ: вот как я это реализовал, на случай, если кому-то интересно:

 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); 
}
  

Комментарии:

1. ну, как я могу это сделать? Я не могу просто написать T.getClass().toString()

Ответ №1:

Java generics не сохраняют информацию о типе после времени компиляции из-за удаления типа. Вам нужно передать экземпляр класса 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); 
}
  

Комментарии:

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

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

3. @Sean — фабричный метод — хорошее предложение.