一、问题复现
引发 java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.Double
错误的示例代码:
public class ClassCastExceptionExample {
public static void main(String[] args) {
Object number = Integer.valueOf(10); // number 是一个 Integer 类型的对象
Double doubleNumber = (Double) number; // 尝试将 Integer 强制转换为 Double
System.out.println(doubleNumber);
}
}
在这段代码中,number
变量最初是一个 Integer
对象(值为 10),但是代码尝试将它强制转换为 Double
类型。
这种转换是不允许的,因此会引发 ClassCastException
异常。
运行这段代码时,将会得到类似以下的错误信息:
Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.Double
at ClassCastExceptionExample.main(ClassCastExceptionExample.java:6)
解决方法是避免不兼容的类型转换,或者在需要时使用适当的类型转换方法。
二、解决方案
1. 直接使用 Double 类型
public class ClassCastExceptionExample {
public static void main(String[] args) {
Object number = Double.valueOf(10.0); // 直接创建 Double 类型对象
Double doubleNumber = (Double) number; // 正确的类型转换
System.out.println(doubleNumber); // 输出 10.0
}
}
2. 将 Integer 转换为 Double
public class ClassCastExceptionExample {
public static void main(String[] args) {
Object number = Integer.valueOf(10); // number 是一个 Integer 类型的对象
Double doubleNumber = ((Integer) number).doubleValue(); // 将 Integer 转换为 Double
System.out.println(doubleNumber); // 输出 10.0
}
}
3. 类型判断
public class ClassCastExceptionExample {
public static void main(String[] args) {
Object number = Integer.valueOf(10); // 作为参数传入的对象
Double doubleNumber = convertToDouble(number);
System.out.println(doubleNumber); // 输出 10.0
}
public static Double convertToDouble(Object obj) {
if (obj instanceof Integer) {
return ((Integer) obj).doubleValue(); // 将 Integer 转换为 Double
} else if (obj instanceof Double) {
return (Double) obj; // 直接返回 Double
} else {
throw new IllegalArgumentException("Unsupported type: " + obj.getClass().getName());
}
}
}
4. 强制转换为double
public class ClassCastExceptionExample {
public static void main(String[] args) {
Object number = Integer.valueOf(10); // number 是一个 Integer 类型的对象
Double doubleNumber = (double) (int) number; // 将 Object 转换为 int或Integer再转double
System.out.println(doubleNumber); // 输出 10.0
}
}
Java中关于double、Double相关问题总结
【Java面试题】Double和double 区别