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

JShell中定义类Z后创建实例出现unexpected type错误求助

问题原因分析

这个问题其实是JShell的上下文解析特性带来的命名冲突——你大概率在定义class Z{}之前,已经在当前JShell会话里把Z当作泛型类型参数用过,但当时并没有提前定义对应的类。

JShell有个特别的行为:当你用一个未定义的标识符作为泛型类型参数时(比如随手输入了var list = new ArrayList<Z>();但没先定义Z类),JShell会自动创建一个隐含的类型参数Z,这个隐含的类型会一直保存在当前会话的上下文中。等你后续再定义class Z{}时,虽然类能成功定义,但在执行var z = new Z()时,JShell的解析器会优先匹配已经存在的隐含类型参数Z,而不是你刚定义的Z类,这就直接触发了那个unexpected type错误,提示你需要的是类,但找到的是类型参数Z。

而你定义X和A类时没踩这个坑,纯粹是因为之前没在会话里把X、A当作未定义的泛型类型参数使用过,所以JShell会直接把它们识别为你定义的类。

验证与解决办法

  • 验证方式:在JShell里输入/types命令,就能查看当前会话中的所有类型,你会发现除了你定义的class Z之外,还有一个type parameter Z存在。
  • 解决办法:
    • 最直接的方式是重启JShell会话,重新定义class Z{}再创建实例,就能正常运行;
    • 如果不想重启,也可以在创建实例时通过类的全限定名来明确指定(如果是默认包的话,JShell会给匿名类生成特殊的内部标识,不过这种场景下重启会话是最省心的)。

内容的提问来源于stack exchange,提问作者user140547

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:42:57