Знание типа общего в Java
У меня есть общий класс, говорит:
MyClass<T>
Внутри метода этого класса я хотел бы проверить тип T, например:
void MyMethod()
{
if (T == String)
...
if (T == int)
...
}
Как мне это сделать?
Спасибо за вашу помощь
7 ответов
Вы не можете, как правило, из-за стирания типа. См. Часто задаваемые вопросы по 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();
}
то есть, передавая объект класса и получая универсальный тип из этого класса.
В дополнение к Клетусу у меня есть одно исключение: супер-токены. Токен супертипа сохранит информацию о типе.
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.
Как уже было сказано, вы можете получить только информацию общего характера, доступную на уровне статического байтового кода.
Можно разрешить значения аргументов типа и проверить, можно ли тогда использовать один тип вместо другого.
Если вы хотите делать разные вещи для разных типов, это все равно будет общим?