关于java:测试对象是否为参数类型的实例

Test if object is instanceof a parameter type

是否可以确定对象是否为泛型类型的实例?

1
2
3
4
5
public < T > test(Object obj) {
    if (obj instanceof T) {
        ...
    }
}

那显然是行不通的。有其他选择吗?就像我想使用Java反射实例化一个类,然后检查以确保其类型为通用T


执行此检查的唯一方法是,如果您具有表示类型的Class对象:

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


要扩展Mark Peters的示例,通常您需要执行以下操作:

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

如果您不想像Mark Peters所述将Class类型作为参数传递,则可以使用以下代码。大卫·奥米拉(David O'Meara)表示敬意。

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


您可以尝试一下,

1
2
3
4
5
6
7
8
9
10
11
12
// 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<? extends T>。而不是使用Class<?>之类的东西。


这仅在(如果有)类型为T的对象时才起作用。然后,您可以获取该对象的类,请参见java.lang.Class<T>,并确定它是否与所讨论的对象相同。

但是请注意,这与我们具有泛型的原因恰恰相反:使用泛型类型是一种方式,您不必关心它实际上是什么类型(可以指定上限和下限)。铅>