检查Generic对象的对象类型的正确方法是什么?

时间:2013-04-19 16:52:35

标签: java object casting warnings instanceof

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

请您告诉我这样做的正确方法是什么?

感谢任何帮助。

1 个答案:

答案 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进行比较,然后根据该参数做出决定。