Проверьте, является ли объект экземпляром типа параметра - PullRequest
67 голосов
/ 20 апреля 2011

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

public <T> test(Object obj) {
    if (obj instanceof T) {
        ...
    }
}

Это явно не работает. Есть ли альтернатива? Как я хочу использовать отражение Java для создания экземпляра класса, а затем проверить, что он имеет тип generic T.

Ответы [ 6 ]

107 голосов
/ 20 апреля 2011

Единственный способ сделать эту проверку - это если у вас есть объект Class, представляющий тип:

Class<T> type; //maybe passed into the method
if ( type.isInstance(obj) ) {
   //...
}
18 голосов
/ 20 апреля 2011

Чтобы расширить выборку Марка Петерса, часто вы хотите сделать что-то вроде:

Class<T> type; //maybe passed to the method
if ( type.isInstance(obj) ) {
   T t = type.cast(obj);
   // ...
}
5 голосов
/ 02 февраля 2018

Если вы не хотите передавать тип класса в качестве параметра, упомянутого Марком Петерсом, вы можете использовать следующий код.Престижность Дэвиду О'Миаре.

  Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
                  .getActualTypeArguments()[0];
  if (type.isInstance(obj)) {
      ...
  }
5 голосов
/ 23 апреля 2015

Вы можете попробовать это,

// Cast your object to the generic type.
T data = null;
try {
    data = (T) obj;
} catch (ClassCastException cce) {
    // Log the error.
}

// Check if the cast completed successfully.
if(data != null) {
    // whatever....
}
3 голосов
/ 20 апреля 2011

Было бы более разумно установить ограничение на то, где тип T используется для параметризации типа Class. Когда вы передаете тип, вместо использования чего-то вроде Class<?>, вы должны использовать Class<? extends T>.

1 голос
/ 20 апреля 2011

Это будет работать (частично), только если у вас есть объект типа T. Затем вы можете получить класс этого объекта, см. java.lang.Class<T> и выяснить, совпадает ли он с рассматриваемым объектом.

Но обратите внимание, что это идет вразрез с самой причиной, по которой у нас есть генетики: использование универсального типа - это способ сказать, что вам все равно, какой это тип на самом деле (вплоть до верхних и нижних границ, которые могут быть указаны).

...