有没有办法确定对象是否是泛型类型的实例?
public <T> test(Object obj) {
if (obj instanceof T) {
...
}
}
这显然不起作用。还有其他选择吗?就像我想使用Java反射来实例化一个类,然后检查以确保它是通用的T
类型。
答案 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>