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会给匿名类生成特殊的内部标识,不过这种场景下重启会话是最省心的)。
- 最直接的方式是重启JShell会话,重新定义
内容的提问来源于stack exchange,提问作者user140547
相关产品推荐
相关产品推荐

