Знание типа общего в 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.

Как уже было сказано, вы можете получить только информацию общего характера, доступную на уровне статического байтового кода.

Можно разрешить значения аргументов типа и проверить, можно ли тогда использовать один тип вместо другого.

Если вы хотите делать разные вещи для разных типов, это все равно будет общим?

Другие вопросы по тегам