Проверьте, является ли объект типом параметра instanceof


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

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

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

6 57

6 ответов:

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

Class<T> type; //maybe passed into the method
if ( type.isInstance(obj) ) {
   //...
}

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

Class<T> type; //maybe passed to the method
if ( type.isInstance(obj) ) {
   T t = type.cast(obj);
   // ...
}

вы могли бы попробовать это,

// 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....
}

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

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

  Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
                  .getActualTypeArguments()[0];
  if (type.isInstance(obj)) {
      ...
  }

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

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