96

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

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

这显然行不通。有替代方案吗?就像我想使用 Java 反射来实例化一个类,然后检查以确保它是 generic 类型T

4

6 回答 6

142

您可以进行此检查的唯一方法是您是否拥有Class表示该类型的对象:

Class<T> type; //maybe passed into the method
if ( type.isInstance(obj) ) {
   //...
}
于 2011-04-20T18:14:51.830 回答
26

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

Class<T> type; //maybe passed to the method
if ( type.isInstance(obj) ) {
   T t = type.cast(obj);
   // ...
}
于 2011-04-20T18:25:08.780 回答
13

如果您不想像 Mark Peters 提到的那样将 Class 类型作为参数传递,您可以使用以下代码。向大卫奥米拉致敬。

  Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
                  .getActualTypeArguments()[0];
  if (type.isInstance(obj)) {
      ...
  }
于 2018-02-02T07:58:14.117 回答
6

你可以试试这个

// 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....
}
于 2015-04-23T15:36:20.330 回答
3

T限制类型用于参数化类型的位置会更有意义ClassClass<?>当你传入类型时,你应该使用.而不是使用类似的东西Class<? extends T>

于 2011-04-20T18:14:35.043 回答
1

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

但请注意,这与我们拥有泛型的原因背道而驰:使用泛型类型是一种表示您不关心它真正是什么类型的方式(直到可以指定的上限和下限)。

于 2011-04-20T18:16:23.633 回答