测试对象是否是参数类型的实例

时间:2011-04-20 18:10:41

标签: java generics instanceof

有没有办法确定对象是否是泛型类型的实例?

public <T> test(Object obj) {
    if (obj instanceof T) {
        ...
    }
}

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

6 个答案:

答案 0 :(得分:106)

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

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

答案 1 :(得分:17)

要扩展Mark Peters的样本,通常要做类似的事情:

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

答案 2 :(得分:5)

你可以试试这个,

// 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....
}

答案 3 :(得分:5)

如果您不想将Class类型作为Mark Peters提及的参数传递,则可以使用以下代码。感谢David O&#39; Meara。

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

答案 4 :(得分:3)

将限制放在T类型用于参数化Class类型的位置更有意义。当您输入类型时,不应使用Class<?>之类的内容,而应使用Class<? extends T>

答案 5 :(得分:1)

如果您有一个类型为T的对象,这只会(部分)起作用。然后您可以获取该对象的类,请参阅java.lang.Class<T>并查找它是否与相关对象相同。

但请注意,这与我们拥有genrics的原因相反:使用泛型类型是一种表示你不关心它实际是什么类型的方式(直到可以指定的上限和下限)。 / p>