#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 — фабричный метод — хорошее предложение.