使用特定类名时出现 JShell 错误“意外类型”

2022-09-03 15:28:08

我只是在玩JShell,似乎定义然后定义不起作用。但是使用不同的类名(如 和 )确实有效。class Z{}var z = new Z()class Xclass A

当然,我一定错过了一些明显的东西...?

|  Welcome to JShell -- Version 14.0.1
|  For an introduction type: /help intro

jshell> class X{}
|  created class X

jshell> class Z{}
|  created class Z

jshell> var x = new X()
x ==> X@26a1ab54
|  created variable x : X

jshell> var z = new Z()
|  Error:
|  unexpected type
|    required: class
|    found:    type parameter Z
|  var z = new Z();
|              ^

jshell> class A{}
|  created class A

jshell> var a = new A()
a ==> A@2ef1e4fa
|  created variable a : A

答案 1

使用 可导致变量具有不可表示的类型。例如,查看表达式的返回类型,可以是 或 :varStringInteger

jshell> /set feedback verbose
jshell> var x = true ? "a" : 1
x ==> "a"
|  created variable x : Serializable&Comparable<? extends Serializable&Comparable<?>&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc

在评估代码片段时,如果是这种情况,它会将其包装在代码块中,以便可以记录此类型以供以后使用。包装片段包括一个名为 的泛型类型参数:jshellZ

        // private static <Z> Z do_itAux() {
        //     wtype x_ = y;
        //     @SuppressWarnings("unchecked")
        //     Z x__ = (Z) x_;
        //     return x__;

此参数的名称会泄漏到正在计算的代码块中,这意味着类的名称被 type 参数遮蔽。这是一个特例 - 其他单个字符示例很好。Z


答案 2

推荐