非泛型类为何引发运行时错误?求实现示例
非泛型Box类引发运行时错误的具体实现示例
嘿,我懂你现在的感受——你写了这个非泛型的Box类,试了半天却没看到预期的运行时错误,对吧?其实问题出在类型转换的环节:非泛型Box因为用Object存储数据,编译时不会限制存入的类型,但当你取出数据并强制转换为某个特定类型时,如果实际存储的类型不匹配,运行时就会炸!
为什么你之前没复现?
大概率是你要么一直存入/取出同一种类型,要么取出时没有做强制类型转换(比如直接用Object接收),这种情况下自然不会触发错误。只有当你预期取出的类型和实际存储的类型不一致,且进行强制转换时,ClassCastException才会出现。
具体错误复现代码
下面是完整的可运行示例,能直接触发运行时异常:
public class BoxDemo { public static void main(String[] args) { Box nonGenericBox = new Box(); // 第一部分:正常存入Integer并取出 nonGenericBox.set(42); Integer expectedInteger = (Integer) nonGenericBox.get(); System.out.println("取出的整数:" + expectedInteger); // 输出42 // 第二部分:错误存入String(编译完全通过,编译器不会阻止) nonGenericBox.set("这是一个字符串"); // 第三部分:尝试取出并强制转换为Integer,运行时报错! Integer wrongCast = (Integer) nonGenericBox.get(); // 这里抛出ClassCastException System.out.println(wrongCast); } } // 你的非泛型Box类(调整了类名首字母大写,符合Java规范) class Box { private Object object; public void set(Object object) { this.object = object; } public Object get() { return object; } }
错误原因详解
- 编译阶段:编译器只知道
get()方法返回Object类型,所以允许你将其强制转换为Integer,不会报错。 - 运行阶段:JVM发现实际存储在Box里的是
String对象,无法转换为Integer,于是抛出java.lang.ClassCastException运行时异常。
泛型如何解决这个问题?
如果换成泛型Box<Integer>,编译阶段就会阻止你存入非Integer类型的数据:
Box<Integer> genericBox = new Box<>(); genericBox.set("字符串"); // 编译直接报错,根本到不了运行阶段
这样就把类型不匹配的问题提前在编译期解决了,避免了运行时崩溃。
内容的提问来源于stack exchange,提问作者Freddy
相关产品推荐
相关产品推荐

