instanceof似乎不起作用 - 我的代码出了什么问题?

时间:2014-04-27 10:30:35

标签: java instanceof

继续我之前的question,我正在尝试编写一个类似这样的方法

public <T extends LivingThing> T getData(Class<T> clazz, Object otherParam) {
    if(clazz instanceof Cat) {
        //do something and return a new Cat
    }
}

我在if条件上遇到编译器错误“不兼容的条件操作数类型”。我究竟做错了什么?如何在我的方法中检查类类型?

更新

好的,我更改了代码以使用isAssignableFrom方法。这是一个新问题。

public <T extends LivingThing> List<T> getData(Class<T> classType) {
        LivingThingEnum livingThing = LivingThingEnum
                .getLivingThing(classType);
        if (livingThings.keySet().contains(livingThing))
            return livingThings.get(livingThing);
        return null;
    }
private Map<LivingThingEnum,List<? extends LivingThing>> livingThings;

这给我一个类型不匹配! - “无法从列表转换为列表”。是不是应该扩展LivingThing,那么在哪种情况下为什么编译器会抛出错误?

3 个答案:

答案 0 :(得分:5)

instanceof运算符处理对象,而不是类。

例如,如果你有变量obj,你可以写:obj instanceof Cat。在您的情况下,您想要检查以下内容:if (Cat.class.isAssignableFrom(clazz))

答案 1 :(得分:3)

您的方法需要Class<T> clazz 而不是 LivingThing的实例。

将您的方法更改为:

public <T extends LivingThing> T getData(T livingThing, Object otherParam) {
    if(livingThing instanceof Cat) {
        //do something and return a new Cat
    }
}

或者使用Class上的isAssignableFrom方法来测试Class而不是实例:

if(Cat.class.isAssignableFrom(clazz))

答案 2 :(得分:1)

尝试使用Class#getName()

public static <T extends LivingThing> T getData(Class<T> clazz, Object otherParam) {
    if (Cat.class.getName().equals(clazz.getName())) {
        System.out.println("cat");
        // do something and return a new Cat
    }
    ...
}

或尝试使用Class#equals()

if (Cat.class.equals(clazz)) {..}