Почему eclipse говорит, что null является примитивным типом?

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

null.toString();

И я получил следующее сообщение об ошибке компилятора:

Невозможно вызвать toString() для примитивного типа null

Это очень странно, так как null не является примитивным типом или ссылкой на объект, как описано здесь: Является ли null объектом?

Итак, чтобы быть уверенным, я попытался скомпилировать такую ​​нечетную строку кода с помощью javac, и я получил этот результат:

NullTest.java: не может быть разыменован

   null.toString();
       ^  

1 ошибка

Кто-нибудь знает, почему Eclipse выдаст сообщение об ошибке (IMO) обманчивого компилятора?

Ответы

Ответ 1

Так как нулевой тип является подтипом Object, возможно, ОК для вызова методов Object на null.

Однако, следуя этой логике, поскольку нулевой тип является подтипом каждого ссылочного типа, нам должно быть позволено вызывать любой метод любого класса/интерфейса на null. Это будет беспорядок.

Синтаксически null.toString() должен быть признан как выражение вызова метода сначала, потому что null является выражением Primary. Затем, чтобы определить класс/интерфейс для поиска метода toString, JLS говорит

... Класс или интерфейс для поиска - это T, если T - тип класса или интерфейса, или верхняя граница T, если T - переменная типа

Это ошибка времени компиляции, если T не является ссылочным типом.

T здесь является нулевым типом; это не тип класса, тип интерфейса или переменная типа, поэтому этот шаг должен завершиться неудачно. Однако это не так, потому что T не является ссылочным типом?

Является ли ссылочный тип нулевого типа? JLS говорит

Типы... делятся на две категории: примитивные типы и ссылочные типы

Числовые типы:....

Ссылочными типами являются типы классов, типы интерфейсов, [переменные типа] и типы массивов. [период!]

Существует также специальный нулевой тип.

В зависимости от вашего синтаксического анализа текста нулевой тип может быть или не быть ссылочным типом. Это обычно не очень важно; это просто вопрос категоризации. Но это приводит к путаницам, например, в этом случае - отказ состоит в том, что T не является "правильным" ссылочным типом, а компилятор по ошибке ошибочно полагает, что он должен быть примитивным типом.

Ответ 2

Нет причин.

Обычно eclipse анализирует байт-код и по какой-то причине null.toString() - это два байтовых оператора, определение и вызов. Поскольку вы можете вызывать toString только для объектов, eclipse предполагает, что declaraion должен объявить примитив.

Вы можете написать Bugreport, но подумайте об издержках, которые могут возникнуть при интернационализации сообщения об ошибке.