我有一个方法,它将对象作为输入,如果输入是instanceOF Long,则将值转换为double值。以下是代码:
std::move
但是当我执行上面的代码时,我遇到了异常:
std::swap
请让我知道为什么它给我例外。
但是如果直接尝试将Long对象转换为double,则没有classCast的异常即将到来。
public static void main(String[] args) {
Long longInstance = new Long(15);
Object value = longInstance;
convertDouble(value);
}
static double convertDouble(Object longValue){
double valueTwo = (double)longValue;
System.out.println(valueTwo);
return valueTwo;
}
这令人困惑。
答案 0 :(得分:6)
在JLS中找到解释,https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.5
在表5.1下。将转化投射到基本类型
Long l = new Long(15);
Object o = l;
将对象类型转换为基元时,它将缩小然后取消装箱。
double d1=(double)o;
在上面的语句中我们试图将Object缩小为Double ,但由于实际值为Long 所以在运行时它会抛出 ClassCastException ,根据 5.1.6中定义的缩小转换规则。缩小参考转换
将Long Type转换为double时,它会执行取消装箱然后加宽。
double d2 =(double)l;
首先通过调用longvalue()方法取消装入Long值,然后从long扩展到double,这可以没有错误。
答案 1 :(得分:1)
如果您不确定对象将是哪种数字类型,那么我建议您使用以下代码段:
double d = 0.0;
if (obj instanceof Number) {
d = ((Number) obj).doubleValue();
}
答案 2 :(得分:0)
首先检查Object是否为instanceof Long,然后调用Long obejct的valueOf
段:
static double convertDouble(Object longValue){
double valueTwo = -1; // whatever to state invalid!
if(longValue instanceof Long)
valueTwo = ((Long) longValue).doubleValue();
System.out.println(valueTwo);
return valueTwo;
}
答案 3 :(得分:0)
您尝试将Object转换为double,因为convertDouble的参数为Type对象。因此,自动拆箱将不起作用。有两种解决方案: 首先,将对象强制转换为Long(使用instanceof检查) 第二,使用Long作为参数
public static void main(String[] args) {
Long longInstance = new Long(15);
Object value = longInstance;
convertDouble(value);
}
static double convertDouble(Long longValue){
double valueTwo = (double)longValue;
System.out.println(valueTwo);
return valueTwo;
}
如果要使用convertDouble方法转换不同类型的参数,则可以使用instanceof进行检查,然后将Object转换为类型,最终得到
答案 4 :(得分:0)
这个方法不是很高效,但可以将任何数字对象转换为常见的 java.lang 对象(字节、短整数、长整数、浮点数和双精度)。
这使用反射来调用 Number 类的方法(shotValue()、intValue() 等)。
不幸的是,不存在 integerValue 方法名称,因此我使用替换字符串将整数转换为 int。
希望能帮到你。
public <T extends Number> T cast(Number value, Class<T> toClass) {
try {
String methodName = toClass.getSimpleName().toLowerCase().replace("integer", "int") + "Value";
Method m = Number.class.getMethod(methodName);
return (T) m.invoke(value);
} catch (Exception ex) {
}
return null;
}