我在编译代码时收到了关于Object Casting的警告消息。我不知道如何用我目前的知识解决它....
假设我有一个通用对象MyGenericObj<T>
它是从非通用对象扩展MyObj
以下是示例代码:
MyObj obj1 = new MyGenericObj<Integer>();
if (obj1 instanceof MyGenericObj) {
//I was trying to check if it's instance of MyGenericObj<Integer>
//but my IDE saying this is wrong syntax....
MyGenericObj<Integer> obj2 = (MyGenericObj<Integer>) obj1;
//This line of code will cause a warning message when compiling
}
请您告诉我这样做的正确方法是什么?
感谢任何帮助。
答案 0 :(得分:6)
由于type erasure,无法做到这一点:MyGenericObj<Integer>
实际上是场景后面的MyGenericObj<Object>
,无论其类型参数如何。
解决此问题的一种方法是向您的通用对象添加Class<T>
属性,如下所示:
class MyGenericObject<T> {
private final Class<T> theClass;
public Class<T> getTypeArg() {
return theClass;
}
MyGenericObject(Class<T> theClass, ... the rest of constructor parameters) {
this.theClass = theClass;
... the rest of the constructor ...
}
}
现在,您可以使用getTypeArg
查找type参数的实际类,将其与Integer.class
进行比较,然后根据该参数做出决定。