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

Nik*_*ris 77 java generics instanceof

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

public <T> test(Object obj) {
    if (obj instanceof T) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 117

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

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

  • @JordiVilaplana这不对,它会给你java.lang.Object作为类.看看这个:http://ideone.com/bxt9Jq (8认同)
  • 使用:`Class &lt;T&gt; type =(Class &lt;T&gt;)((ParameterizedType)getClass()。getGenericSuperclass())。getActualTypeArguments()[0];` (2认同)

Puc*_*uce 18

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

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


Ton*_*oei 7

如果您不想像Mark Peters那样将Class类型作为参数传递,则可以使用以下代码。感谢David O'Meara。

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

  • 它提供了“类型安全:从类型到 Class&lt;T&gt; 的未经检查的强制转换” (7认同)

Geo*_*lou 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....
}
Run Code Online (Sandbox Code Playgroud)

  • **这不起作用!**演员成功**所有**类型.这就是它给出"未经检查的强制转换"编译警告的原因. (5认同)