我有一个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;
}
}
}
有人可以解释我哪里出错吗
答案 0 :(得分:5)
简答:详情很重要。
一些信息:value
类实例变量(也称为属性或成员变量)是名为Value
的类。
由于课程Value
既不是Integer
也不是Double
课程,
else分支将始终执行。
Value
类还有一个名为value
的成员变量,
哪一个,
在你的例子中,
类型为Double
。
在你拍摄的截屏中,
Value
对象将其value
成员变量设置为“thing”,其类型为Value
。
我知道这一点,因为对话框显示“value = Value(id:82)”。
答案 1 :(得分:2)
首先,我同意Ole V.V.,killjoy和david 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.value
是instanceof
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
,但这会令人惊讶。