12

在第 33 行重新声明 Integer 'a' 时,为什么 jshell 将引用变量显示为 Integer 的实例(请参阅第 38 和 39 行)?重新声明后,第 34 行显示 'a' 设置为 null。当 'a' 在第 6 行声明但未给定值,或在第 22 行重置为 null 时,'a' 不被视为 Integer 的实例。我希望当引用变量被重新声明时,因为它的值为空,它不会是一个类型的实例;然而,事实并非如此。

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: $2 ==> false
11: |  created scratch variable $2 : boolean
12: 
13: jshell> a = 1;
14: a ==> 1
15: |  assigned to a : Integer
16: 
17: jshell> a instanceof Integer;
18: $4 ==> true
19: |  created scratch variable $4 : boolean
20: 
21: jshell> a = null;
22: a ==> null
23: |  assigned to a : Integer
24: 
25: jshell> a instanceof Integer;
26: $6 ==> false
27: |  created scratch variable $6 : 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: $9 ==> true
40: |  created scratch variable $9 : boolean
4

2 回答 2

5

我已将其作为错误提出并已被接受。

https://bugs.openjdk.java.net/browse/JDK-8211694

好地方。

于 2018-10-04T10:12:19.683 回答
3

问题是,尽管它说它设置为 null,但实际上并非如此。有关更多详细信息,请参阅错误中添加的注释。

我已将错误标题更改为:JShell: Redeclared variable should be reset

我将尝试在 JDK 12 中修复。

第二个问题不是错误,Java 不允许 instanceof 运算符不能为真——行为与 javac 完全匹配。

于 2018-10-10T17:24:43.247 回答