使用特定 class 名称时 JShell 错误 "unexpected type"
JShell error "unexpected type" when using specific class name
我只是在玩JShell,似乎定义class Z{}
然后定义
var z = new Z()
不起作用。但是使用不同的 class 名称,例如 class X
和 class 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
使用 var
会导致变量的 . For example, 表达式可能是 String
或 Integer
:
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
当jshell
评估你的代码片段时,如果是这种情况,它wraps it in a block of code以便它可以记录这种类型以备后用。包装片段包含一个名为 Z
:
的泛型类型参数
// private static <Z> Z do_itAux() {
// wtype x_ = y;
// @SuppressWarnings("unchecked")
// Z x__ = (Z) x_;
// return x__;
此参数的名称泄漏到正在评估的代码块中,这意味着 class 的名称被类型参数遮蔽了。这使得 Z
成为一个特例——其他单字符示例都可以。
我只是在玩JShell,似乎定义class Z{}
然后定义
var z = new Z()
不起作用。但是使用不同的 class 名称,例如 class X
和 class 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
使用 var
会导致变量的 String
或 Integer
:
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
当jshell
评估你的代码片段时,如果是这种情况,它wraps it in a block of code以便它可以记录这种类型以备后用。包装片段包含一个名为 Z
:
// private static <Z> Z do_itAux() {
// wtype x_ = y;
// @SuppressWarnings("unchecked")
// Z x__ = (Z) x_;
// return x__;
此参数的名称泄漏到正在评估的代码块中,这意味着 class 的名称被类型参数遮蔽了。这使得 Z
成为一个特例——其他单字符示例都可以。