【问题标题】:Java instanceOf Class not comparing as expected [duplicate]Java instanceOf Class未按预期进行比较[重复]
【发布时间】:2018-04-03 17:39:18
【问题描述】:

我有以下代码,

public <T> T build(Object source, Class<T> destClass) {
        if((Object)destClass instanceof TestDTO){
            return (T) testBuilder.build((BlahDTO) source);
        }
        if((Object)destClass instanceof BestDTO) {
            return (T) bestBuilder.build((BlahDTO) source);
        }
        return null;
    }

我正在尝试比较 destClass 是否为 TestDTO 或 BestDTO 类型,并采取适当的措施。但是即使 destClass 是指定的类型,比较也会失败。我是否遗漏了什么,也是我的替代方法,

public <T> T build(Object source, Class<T> destClass) {
        if(destClass.getSimpleName().equals(TestDTO.class.getSimpleName())){
            return (T) testBuilder.build((BlahDTO) source);
        }
        if(destClass.getSimpleName().equals(BestDTO.class.getSimpleName())) {
            return (T) bestBuilder.build((BlahDTO) source);
        }
        return null;
    }

虽然这种方法有效,但我觉得这段代码有点冒险。如果有人指出我做错了什么,或者提出另一种方法,那将会很有帮助。提前致谢!

【问题讨论】:

  • 请注意,一个类不是一个类的实例,并且将一个类转换为Object not 也不会使其成为一个实例。请改用Class.isAssignableFrom()

标签: java generics factory-pattern


【解决方案1】:

instanceof 检查左侧操作数是否是右侧操作数的实例。但是您的左侧操作数是 Class 对象,而不是该类的实例。要使用instanceof,您必须有一个类的实例(通过new TheClass 创建的东西)。

作为Thomas points out,如果您真的想使用Class 实例,您可能需要isAssignableFrom

if (TestDTO.class.isAssignableFrom(destClass))

旁注:(Object)if((Object)destClass instanceof TestDTO) 的演员表没有任何目的。 instanceof 检查对象,而不是你对它的那种引用;强制转换与该检查无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多