У меня есть общий класс, говорит:
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.
Если вы хотите делать разные вещи для разных типов, он все равно будет общим?