Есть ли способ определить, является ли объект экземпляром универсального типа?
public <T> test(Object obj) {
if (obj instanceof T) {
...
}
}
Это явно не работает. Есть ли альтернатива? Например, я хочу использовать отражение Java для создания экземпляра класса, а затем проверить, имеет ли он тип generic T
.
java
generics
instanceof
Никордарис
источник
источник
type
в качестве параметра метода, возможно, вы хотите его инициализировать:Class type = ((T) new Object()).getClass();
Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Чтобы расширить пример Марка Петерса, часто вам нужно сделать что-то вроде:
Class<T> type; //maybe passed to the method if ( type.isInstance(obj) ) { T t = type.cast(obj); // ... }
источник
Если вы не хотите передавать тип класса в качестве параметра, как упомянул Марк Петерс, вы можете использовать следующий код. Престижность Дэвида О'Мира.
Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()) .getActualTypeArguments()[0]; if (type.isInstance(obj)) { ... }
источник
Type safety: Unchecked cast from Type to Class<T>
Вы можете попробовать это,
// 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>
.источник
Это будет работать (частично), только если у вас есть объект типа T. Затем вы можете получить класс этого объекта, посмотреть
java.lang.Class<T>
и выяснить, совпадает ли он с рассматриваемым объектом.Но обратите внимание, что это противоречит самой причине, по которой у нас есть родословные: использование универсального типа - это способ сказать, что вам все равно, какой он на самом деле тип (вплоть до верхней и нижней границ, которые могут быть указаны).
источник