在 jshell-11 中,为什么重新声明的引用变量重置为 null 仍然有类型?
In jshell-11, why does a redeclared reference variable that resets to null still have a type?
在第 33 行重新声明 Integer 'a' 时,为什么 jshell 将引用变量显示为 Integer 的实例(请参阅第 38 和 39 行)?重新声明后,第 34 行显示 'a' 设置为 null。当在第 6 行声明 'a' 但未赋值,或在第 22 行重置为 null 时,'a' 不被视为 Integer 的实例。我希望当引用变量被重新声明时,因为它的值为 null,所以它不会是一个类型的实例;然而,事实并非如此。
01: java-lava:~ cafedude$ jshell
02: | Welcome to JShell -- Version 11
03: | For an introduction type: /help intro
04:
05: jshell> Integer a;
06: a ==> null
07: | created variable a : Integer
08:
09: jshell> a instanceof Integer;
10: ==> false
11: | created scratch variable : boolean
12:
13: jshell> a = 1;
14: a ==> 1
15: | assigned to a : Integer
16:
17: jshell> a instanceof Integer;
18: ==> true
19: | created scratch variable : boolean
20:
21: jshell> a = null;
22: a ==> null
23: | assigned to a : Integer
24:
25: jshell> a instanceof Integer;
26: ==> false
27: | created scratch variable : boolean
28:
29: jshell> a = 1;
30: a ==> 1
31: | assigned to a : Integer
32:
33: jshell> Integer a;
34: a ==> null
35: | modified variable a : Integer
36: | update overwrote variable a : Integer
37:
38: jshell> a instanceof Integer;
39: ==> true
40: | created scratch variable : boolean
我已将其作为错误提出并已被接受。
https://bugs.openjdk.java.net/browse/JDK-8211694
好地方。
问题是,虽然它说它设置为空,但实际上不是。有关详细信息,请参阅错误中添加的评论。
我已将错误标题更改为:
JShell:重新声明的变量应该被重置
我会尝试在 JDK 12.
中修复
第二个问题不是错误,Java 不允许 instanceof 运算符不为真 -- 行为与 javac 完全匹配。
在第 33 行重新声明 Integer 'a' 时,为什么 jshell 将引用变量显示为 Integer 的实例(请参阅第 38 和 39 行)?重新声明后,第 34 行显示 'a' 设置为 null。当在第 6 行声明 'a' 但未赋值,或在第 22 行重置为 null 时,'a' 不被视为 Integer 的实例。我希望当引用变量被重新声明时,因为它的值为 null,所以它不会是一个类型的实例;然而,事实并非如此。
01: java-lava:~ cafedude$ jshell
02: | Welcome to JShell -- Version 11
03: | For an introduction type: /help intro
04:
05: jshell> Integer a;
06: a ==> null
07: | created variable a : Integer
08:
09: jshell> a instanceof Integer;
10: ==> false
11: | created scratch variable : boolean
12:
13: jshell> a = 1;
14: a ==> 1
15: | assigned to a : Integer
16:
17: jshell> a instanceof Integer;
18: ==> true
19: | created scratch variable : boolean
20:
21: jshell> a = null;
22: a ==> null
23: | assigned to a : Integer
24:
25: jshell> a instanceof Integer;
26: ==> false
27: | created scratch variable : boolean
28:
29: jshell> a = 1;
30: a ==> 1
31: | assigned to a : Integer
32:
33: jshell> Integer a;
34: a ==> null
35: | modified variable a : Integer
36: | update overwrote variable a : Integer
37:
38: jshell> a instanceof Integer;
39: ==> true
40: | created scratch variable : boolean
我已将其作为错误提出并已被接受。
https://bugs.openjdk.java.net/browse/JDK-8211694
好地方。
问题是,虽然它说它设置为空,但实际上不是。有关详细信息,请参阅错误中添加的评论。
我已将错误标题更改为: JShell:重新声明的变量应该被重置
我会尝试在 JDK 12.
中修复第二个问题不是错误,Java 不允许 instanceof 运算符不为真 -- 行为与 javac 完全匹配。