我有一个Value类,其中有一个Object value。我想使用这个值作为String、Integer或Double。
asDouble方法控制instanceof值对象。如果不是Double或Integer,则返回0。
一般来说,它可以工作,但有时尽管它是Double returns 0;。我不能解释原因。
调试时,我可以看到:

这是我的价值课
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; 
        }
    }
}有人能解释我哪里出了问题吗?
发布于 2018-04-16 15:39:17
简短的回答:细节很重要。
一些信息:value类实例变量(也称为属性或成员变量)是一个名为Value的类。因为类Value既不是Integer,也不是Double类,所以其他分支将始终执行。
Value类还有一个名为value的成员变量,在您的示例中,该变量具有一种Double类型。
在您所包含的屏幕快照中,Value对象将其value成员变量设置为"thing“,该”thing“也具有Value类型。我之所以知道这一点,是因为对话框显示"value=值(id:82)“。
发布于 2018-04-16 16:33:16
首先,我同意Ole V.V.、killjoy和david a的评论。
您的截图显示了一个Value-Object在value-property中持有另一个Value-Object
注释和可能的解决方案在下面的示例类中进行总结
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.value是instanceof String的情况。
发布于 2018-04-16 15:27:15
instanceof检查适用于包含加载类的ClassLoader的完整类定义。可能this.value是由不同的ClassLoader加载的,检查失败了。您可以通过尝试来确认:
ClassLoader cl1 = this.value.getClass().getClassLoader()
ClassLoader cl2 = Double.class.getClassLoader();
if (cl1.equals(cl2)) {
   ...
}尽管ClassLoader对象之间的父-子关系可能会变得更加复杂,但 fails。
其他选择是,您的Double不是java.lang.Double,但这将是令人惊讶的。
https://stackoverflow.com/questions/49860339
复制相似问题