Вывод локального типа Java – присвоение var нескольким типам – путаницаJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Вывод локального типа Java – присвоение var нескольким типам – путаница

Сообщение Anonymous »

Рассмотрите следующий фрагмент ниже

Код: Выделить всё

var i = true ? Integer.valueOf(1) : "ABC"; //this works - why ?
System.out.println(i instanceof Object); //prints true
System.out.println(i instanceof Integer); //prints true
System.out.println(i instanceof String); //prints false

System.out.println(i);  //prints 1
i = "haha";  //this compiles ok. How can we assign "haha" to Integer ??

System.out.println(i); //prints "haha"
Как, черт возьми, мы можем присвоить строку переменной, тип которой уже был выведен как целое число (поскольку «i instanceof Integer» печатает true)?
Почему компилятор допускает это и что здесь подразумевается для i?
Обратите внимание, если я скажу следующее:

Код: Выделить всё

var i2 = 10;
i2 = "lol";
Я получаю ошибку компиляции: несовместимые типы: строка не может быть преобразована в int
Дополнение:

Код: Выделить всё

var x = new Random().nextBoolean() ? 33 : new File("/tmp/");
System.out.println(x.getClass());
x = 5;
x = "wtf"; //this also is OK!
Это также нормально компилируется, и, как и ожидалось, x.getClass() иногда печатает java.io.File, а иногда java.lang.Integer.
Но даже когда он печатает java.io.File, оператор x = 5 всегда работает и компилируется нормально. Более того, x = "wtf" тоже компилируется нормально.


Подробнее здесь: https://stackoverflow.com/questions/791 ... -confusion
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»