У меня есть общий класс, говорит:
MyClass<T>
Внутри метода этого класса я хотел бы проверить тип T, например:
void MyMethod()
{
if (T == String)
...
if (T == int)
...
}
как я могу это сделать?
Спасибо за помощь
У меня есть общий класс, говорит:
MyClass<T>
Внутри метода этого класса я хотел бы проверить тип T, например:
void MyMethod()
{
if (T == String)
...
if (T == int)
...
}
как я могу это сделать?
Спасибо за помощь
Вы не можете, как правило, из-за стирания типа. Подробнее см. Часто задаваемые вопросы по Java Generics Angelika Langer.
Что вы можете сделать, это передать Class<T>
в свой конструктор, а затем проверить, что:
public MyClass<T>
{
private final Class<T> clazz;
public MyClass(Class<T> clazz)
{
this.clazz = clazz;
}
public void myMethod()
{
if (clazz == String.class)
{
...
}
}
}
Обратите внимание, что Java не позволяет использовать примитивы для аргументов типа, поэтому int
отсутствует...
Из-за типа стирания вы не можете... в основном. Но есть одно исключение. Рассмотрим:
class A {
List<String> list;
}
public class Main {
public static void main(String args[]) {
for (Field field : A.class.getDeclaredFields()) {
System.out.printf("%s: %s%n", field.getName(), field.getGenericType());
}
}
}
Вывод:
list: java.util.List<java.lang.String>
Если вам нужен объект класса, так вы обычно его обрабатываете:
public <T> T createObject(Class<T> clazz) {
return clazz.newInstance();
}
то есть путем передачи объекта класса вокруг и получения родового типа из этого класса.
В дополнение к cletus одно исключение у меня есть: маркеры супер-типа. Ток супер-типа сохранит информацию о типе.
new Type<Set<Integer>>() {}
Информация о типе может быть получена с помощью Class.getGenericSuperClass.
if (object instanceof String)
System.out.println("object is a string");
Как уже было сказано, вы можете получить только информацию, связанную с генериками, на уровне статического байтового кода.
Возможно разрешить значения аргументов типа и проверить, тип может использоваться вместо другого.
если у вас есть подкласс B extends A
, который также должен соответствовать подходу clazz == A.class
. Не работает. Затем вы должны использовать A.class.isInstance(b)
, где b - объект типа B.
Если вы хотите делать разные вещи для разных типов, он все равно будет общим?