Питання Чому затьмарення говорить, що нуль - це примітивний тип?


Я написав цю лінію коду в eclipse mars для цілей messing:

null.toString();

І я отримав таке повідомлення про помилку компілятора:

Неможливо викликати toString () до нульового примітивного типу

З тих пір це дуже дивно null це не примітивний тип, а посилання на об'єкт, як це пояснено тут: Чи є нульовим об'єкт?

Отже, щоб бути впевненим, я намагався скомпілювати таку непарну лінію коду за допомогою javac, і я отримав цей результат:

NullTest.java: 3: неможливо перезаписати

   null.toString();
       ^  

1 помилка

Хто-небудь знає, чому Eclipse дасть таке (IMO) помилкове повідомлення про помилку компілятора?


15
2017-11-05 15:17


походження


Я отримую те саме "примітивне" повідомлення про помилку в Kepler і Luna теж, так що це не нова справа. - azurefrog
Схоже, помилка помилки оцінювання в ECJ. Файл помилки на ньому, який вони будуть ігнорувати, поки Java не замінить іншу мову. - chrylis
Так, пахне мені як помилка.Протягом довгого часу це було. - Makoto


Відповіді:


Оскільки нуль-типу є a підтип від Object, можна припустити, що закликати Object методи на null.

Однак, слідуючи цій логіці, оскільки нульовий тип є підтипом кожного еталонного типу, нам слід дозволити викликати будь-який метод будь-якого класу / інтерфейсу на null. Це буде безлад.

Синтаксично null.toString() має бути визнаний як спосіб виклику методу спочатку, тому що null це Primary вираз Потім визначте клас / інтерфейс для пошуку методу toString, JLS каже

... Клас або інтерфейс для пошуку T, якщо T - це тип класу або інтерфейсу, або верхня межа T, якщо T - типова змінна

Це помилка часу компіляції, якщо T не є еталонним типом.

T є нульовим типом тут; це не тип класу, тип інтерфейсу або тип змінної, тому цей крок повинен вийти з ладу. Однак, це не вдається, тому що T не є еталонним типом?

Чи є вихідний тип контрольного типу? JLS каже

Типи ... поділяються на дві категорії: примітивні типи та типи референції

Числові типи є ....

Типи реферування - це типи класів, типи інтерфейсів, [типи змінних] та типи масивів. [період!]

Існує також спеціальний нульовий тип.

Залежно від вашого аналізу тексту, нульовий тип може бути або не бути еталонним типом. Це звичайно не дуже важливо; це лише питання класифікації. Але це призводить до плутанини, наприклад, у цьому випадку - провал тому T не є "правильним" еталонним типом, і компілятор помилково виводить, що він повинен бути примітивним типом.


5
2017-11-05 17:03



Я думаю, що це те, що Scala зробила правильно. Клас Опції. Містить нуль або щось або дійсне. - Totoro
@ Тоторо, якщо ви маєте на увазі Option, ну теж називається подібний тип Optional. - Luiggi Mendoza
Це пояснення виглядає більш цікавим та переконливим для мене. Принаймні, це змушує мене думати, що Eclipse хлопці забув що існує нульовий тип і лише припускається, що якщо ця змінна не є посиланням, то вона є примітивною і нехай вона буде. Помилки або припущення, як це відбувається навіть у найбільш досвідчених командах. - Luiggi Mendoza
@LuiggiMendoza - Я думаю, що більш розумним вибором є розглянути нульовий тип контрольного типу; Я впевнений, що більшість людей так думає; і JLS, ймовірно, є багато місць, де це має на увазі. - ZhongYu
@yshavit - 4.10 каже, що null-type - це підтип кожного типу (навіть у тому числі примітивний тип, можливо, помилка там). Специфікація дуже хаотична на нуль. Я думаю, що об'єднує безліч різних концепцій (щоб бути більш стислим?) - пустий тип, нульовий тип (з одним значенням - нульовим), строгий клас / тип інтерфейсу (з об'єктними значеннями, без нуля), вільний контрольний тип. - ZhongYu


Немає причин.

Зазвичай Eclipse аналізує байт-код і з якоїсь причини null.toString() Є два байт-код-висловлювання, визначення та виклик. Тому що ви можете зателефонувати toString тільки на об'єктах, затемнення припускає, що декларайон повинен оголосити примітиву.

Ви можете написати a Повідомлення про помилку але подумайте про накладні витрати, які можуть прийти з інтернаціоналізацією повідомлення про помилку.


-2
2017-11-05 15:33



Якщо ви говорите про інтернаціоналізацію повідомлення про помилку, я повинен сказати, що вони надають помилкове повідомлення про помилку кількома мовами, а не тільки англійською! - Luiggi Mendoza
Але це нове повідомлення, яке досі не існує ніякою іншою мовою. Його робота проти нерозуміння. - Peter Rader
Eclipse не аналізує байт-код: це власний компілятор, який аналізує вихідний код, що створює AST, потім випускає байт-код. Отже, ваша відповідь вводить в оману. - Tagir Valeev