Ответ 1
Единственный способ выполнить эту проверку - если у вас есть объект Class
, представляющий тип:
Class<T> type; //maybe passed into the method
if ( type.isInstance(obj) ) {
//...
}
Есть ли способ определить, является ли объект экземпляром универсального типа?
public <T> test(Object obj) {
if (obj instanceof T) {
...
}
}
Это явно не работает. Есть ли альтернатива? Как я хочу использовать отражение Java, чтобы создать экземпляр класса, а затем проверить, чтобы убедиться, что он имеет тип generic T
Единственный способ выполнить эту проверку - если у вас есть объект Class
, представляющий тип:
Class<T> type; //maybe passed into the method
if ( type.isInstance(obj) ) {
//...
}
Чтобы расширить образец Mark Peters, часто вы хотите сделать что-то вроде:
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....
}
Если вы не хотите передавать тип Class в качестве параметра, упомянутого Марком Петерсом, вы можете использовать следующий код. Престижность Дэвиду О'Миаре.
Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
if (type.isInstance(obj)) {
...
}
Было бы разумнее поставить ограничение на то, где тип T
используется для параметризации типа Class
. Когда вы передаете тип, вместо того, чтобы использовать что-то вроде Class<?>
, вы должны использовать Class<? extends T>
.
Это будет работать (частично), если у вас есть объект типа T. Затем вы можете получить класс этого объекта, см. java.lang.Class<T>
и найти, совпадает ли он с данным объектом.
Но обратите внимание, что это противоречит самой причине, по которой у нас есть следующие жанры: использование универсального типа - это способ сказать, что вам все равно, какой тип он есть (до верхних и нижних границ, которые могут быть указаны).
Это тоже работает
public <T> void functionName(T input){
Foo foo = new Foo(); // one of the expected objects
if(input.getClass().isInstance(foo){
doSomeThingWith((Foo)input);
}
}
Завершите демонстрацию Live демо на repl.it