Знание типа обобщенного в Java

У меня есть общий класс, говорит:

MyClass<T>

Внутри метода этого класса я хотел бы проверить тип T, например:

void MyMethod()
{

    if (T == String)
        ...
    if (T == int)
        ...
}

как я могу это сделать?

Спасибо за помощь

Ответ 1

Вы не можете, как правило, из-за стирания типа. Подробнее см. Часто задаваемые вопросы по 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 отсутствует...

Ответ 2

Из-за типа стирания вы не можете... в основном. Но есть одно исключение. Рассмотрим:

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

то есть путем передачи объекта класса вокруг и получения родового типа из этого класса.

Ответ 3

В дополнение к cletus одно исключение у меня есть: маркеры супер-типа. Ток супер-типа сохранит информацию о типе.

new Type<Set<Integer>>() {}

Информация о типе может быть получена с помощью Class.getGenericSuperClass.

Ответ 4

if (object instanceof String)
   System.out.println("object is a string");

Ответ 6

если у вас есть подкласс B extends A, который также должен соответствовать подходу clazz == A.class. Не работает. Затем вы должны использовать A.class.isInstance(b), где b - объект типа B.

Ответ 7

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