You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非泛型类为何引发运行时错误?求实现示例

非泛型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:17:16