Проверьте, является ли объект типом параметра instanceof
есть ли способ определить, является ли объект экземпляром универсального типа?
public <T> test(Object obj) {
if (obj instanceof T) {
...
}
}
это явно не работает. Есть ли альтернатива? Как я хочу использовать отражение Java для создания экземпляра класса, а затем проверить, чтобы убедиться, что он имеет тип generic T
.
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: использование универсального типа-это способ сказать, что вам все равно, какой тип он на самом деле (до верхних и нижних границ, которые могут быть указаны).