有没有办法确定一个对象是否是泛型类型的实例?
public <T> test(Object obj) {
if (obj instanceof T) {
...
}
}
这显然行不通。有替代方案吗?就像我想使用 Java 反射来实例化一个类,然后检查以确保它是 generic 类型T
。
有没有办法确定一个对象是否是泛型类型的实例?
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);
// ...
}
如果您不想像 Mark Peters 提到的那样将 Class 类型作为参数传递,您可以使用以下代码。向大卫奥米拉致敬。
Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
if (type.isInstance(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>
。
如果你有一个类型为 T 的对象,这只会(部分)起作用。然后你可以获取该对象的类,查看java.lang.Class<T>
并查找它是否与所讨论的对象相同。
但请注意,这与我们拥有泛型的原因背道而驰:使用泛型类型是一种表示您不关心它真正是什么类型的方式(直到可以指定的上限和下限)。