Почему в jshell-11 повторно объявленная ссылочная переменная, которая сбрасывается до нуля, все еще имеет тип?

Почему при повторном объявлении Integer 'a' в строке 33 jshell показывает ссылочную переменную как экземпляр Integer (см. строки 38 и 39)? После повторного объявления в строке 34 показано, что 'a' имеет значение null. Когда 'a' объявляется в строке 6, но ему не присваивается значение, или сбрасывается до нуля в строке 22, '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: $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

person B. Atkinson    schedule 02.10.2018    source источник
comment
Хороший вопрос! Мое текущее предположение состоит в том, что результат в строке 39 является ошибкой, вызванной остаточными метаданными, которые не были очищены при выполнении строки 33.   -  person muttonUp    schedule 03.10.2018
comment
Я поднял это как потенциальную ошибку.   -  person muttonUp    schedule 03.10.2018
comment
@muttonUp Спасибо. Является ли отправка в систему ошибок JDK, и если да, то какой номер для отслеживания?   -  person B. Atkinson    schedule 04.10.2018


Ответы (2)


Проблема в том, что, хотя он говорит, что он равен нулю, на самом деле это не так. Дополнительные сведения см. в добавленных комментариях к ошибке.

Я изменил название ошибки на: JShell: повторно объявленная переменная должна быть сброшена

Я попытаюсь исправить в JDK 12.

Вторая проблема не является ошибкой, Java не разрешает операторы instanceof, которые не могут быть истинными - поведение точно соответствует javac.

person Robert Field    schedule 10.10.2018

Я поднял это как ошибку, и это было принято.

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

Хорошее место.

person muttonUp    schedule 04.10.2018