![](/img/trans.png)
[英]MongoDB: class java.lang.Double cannot be cast to class java.lang.Long
[英]java.lang.Long cannot be cast to java.lang.Double
我有一个将对象作为输入的方法,如果输入是 instanceOF Long,则将值转换为双精度值。 下面是代码:
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;
}
但是当我执行上面的代码时,我遇到了以下异常:
Exception in thread "main" java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double
at com.datatypes.LongTest.convertDouble(LongTest.java:12)
at com.datatypes.LongTest.main(LongTest.java:8)
请让我知道为什么它给我例外。
但是如果直接尝试将 Long 对象转换为 double 则不会出现 classCast 异常。
Long longInstance = new Long(15);
double valueOne = (double)longInstance;
System.out.println(valueOne);
这令人困惑。
在 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;
将 Object Type 转换为原始类型时,它将缩小然后拆箱。
double d1=(double)o;
在上面的语句中,我们试图将Object 缩小为 Double ,但由于实际值是 Long所以在运行时它会根据5.1.6 中定义的缩小转换规则抛出ClassCastException 。 缩小参考转换
将 Long Type 转换为 double 时,会先拆箱,然后加宽。
double d2 =(double)l;
它将首先通过调用 longvalue() 方法对 Long 值进行拆箱,然后进行从 long 到 double 的扩展,这可以没有错误。
如果您不确定对象是什么数字类型,那么我建议使用以下代码片段:
double d = 0.0;
if (obj instanceof Number) {
d = ((Number) obj).doubleValue();
}
首先检查Object是否为instanceof Long,然后调用Long对象的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;
}
您尝试将 Object 转换为 double,因为您的 convertDouble 参数是 Type 对象。 因此,自动拆箱将不起作用。 将有两种解决方案:首先,将 Object 强制转换为 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 转换为类型,你最终有
这种方法不是很高效,但可以将任何 Number 对象转换为常见的 java.lang 对象(Byte、Short、Integer、Long、Float 和 Double)。
这使用反射来调用 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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.