Java instanceof不匹配Double

时间:2018-04-16 14:54:22

标签: java casting

我有一个Value类,其中有一个Object value。我想将该值用作StringIntegerDouble

asDouble方法控制instanceof值对象。如果不是DoubleInteger则返回0

通常它有效但有时虽然是Double returns 0;。我不能理解它。

当我调试时,我可以看到:

you can check

这是我的价值等级

public class Value{
    public Object value;

    public Value(Object value) {
        this.value = value;
    }

    public Double asDouble() {
        if (this.value instanceof Integer || this.value instanceof Double) {
            return Double.parseDouble(String.valueOf(this.value));
        } else {
            return 0.0; 
        }
    }
}

有人可以解释我哪里出错吗

3 个答案:

答案 0 :(得分:5)

简答:详情很重要。

一些信息:value类实例变量(也称为属性或成员变量)是名为Value的类。 由于课程Value既不是Integer也不是Double课程, else分支将始终执行。

Value类还有一个名为value的成员变量, 哪一个, 在你的例子中, 类型为Double

在你拍摄的截屏中, Value对象将其value成员变量设置为“thing”,其类型为Value。 我知道这一点,因为对话框显示“value = Value(id:82)”。

答案 1 :(得分:2)

首先,我同意Ole V.V.killjoydavid a的评论。

您的屏幕截图显示Value - 对象在其Value - 属性中保存另一个value - 对象

评论和可能的解决方案总结在以下示例类

public class Value {
    // visibility should be private
    private final Object value;

    // to be more type-save 
    // and to restrict
    // this.values instance-type to Double, Integer and/or String
    // provide three public constructors
    public Value(final Double value) {
        this.value = value;
    }

    public Value(final Integer value) {
        this.value = value;
    }

    public Value(final String value) {
        this.value = value;
    }

    public double asDoublePrimitive() {
        if ((this.value instanceof Number)) {
            return ((Number) this.value).doubleValue();
        }
        return 0.0;
    }

    public Double asDoubleObject() {
        if ((this.value instanceof Number)) {
            return Double.valueOf(((Number) this.value).doubleValue());
        }
        return Double.valueOf(0.0);
    }
}

请注意,您和我的代码都不会考虑this.valueinstanceof String

的情况

答案 2 :(得分:1)

instanceof检查适用于完整的类定义,其中包括加载类的ClassLoader。可能this.value由不同的ClassLoader加载,检查失败。您可以尝试确认:

ClassLoader cl1 = this.value.getClass().getClassLoader()
ClassLoader cl2 = Double.class.getClassLoader();
if (cl1.equals(cl2)) {
   ...
}

虽然ClassLoader个对象this answer provides a good example when instanceof fails之间的父子关系会变得更加棘手。

其他选项是您的Double不是java.lang.Double,但这会令人惊讶。