Ответ 1
Так как нулевой тип является подтипом Object
, возможно, ОК для вызова методов Object
на null
.
Однако, следуя этой логике, поскольку нулевой тип является подтипом каждого ссылочного типа, нам должно быть позволено вызывать любой метод любого класса/интерфейса на null
. Это будет беспорядок.
Синтаксически null.toString()
должен быть признан как выражение вызова метода сначала, потому что null
является выражением Primary
. Затем, чтобы определить класс/интерфейс для поиска метода toString
, JLS говорит
... Класс или интерфейс для поиска - это T, если T - тип класса или интерфейса, или верхняя граница T, если T - переменная типа
Это ошибка времени компиляции, если T не является ссылочным типом.
T
здесь является нулевым типом; это не тип класса, тип интерфейса или переменная типа, поэтому этот шаг должен завершиться неудачно.
Однако это не так, потому что T не является ссылочным типом?
Является ли ссылочный тип нулевого типа? JLS говорит
Типы... делятся на две категории: примитивные типы и ссылочные типы
Числовые типы:....
Ссылочными типами являются типы классов, типы интерфейсов, [переменные типа] и типы массивов. [период!]
Существует также специальный нулевой тип.
В зависимости от вашего синтаксического анализа текста нулевой тип может быть или не быть ссылочным типом. Это обычно не очень важно; это просто вопрос категоризации. Но это приводит к путаницам, например, в этом случае - отказ состоит в том, что T
не является "правильным" ссылочным типом, а компилятор по ошибке ошибочно полагает, что он должен быть примитивным типом.