5

在编译我的代码时,我收到了关于 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 
}

您能否让我知道这样做的正确方法是什么?

任何帮助表示赞赏。

4

1 回答 1

6

由于类型擦除,没有办法做到这一点: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来查找类型参数的实际类,将其与 进行比较Integer.class,并据此做出决定。

于 2013-04-19T16:54:11.543 回答