Почему существует "ScalaObject"?

Почему все классы Scala наследуют от ScalaObject, хотя эта черта полностью пуста и не имеет функции (видимой?) по сравнению с AnyRef, которая определяет дополнительные методы?

Не будет ли этот метод замедления вызвать как equals() или hashCode(), потому что ему нужно будет учитывать другой класс (который может переопределить методы)?

Невозможно ли сбросить AnyRef и ScalaObject в один класс?

UPDATE: ScalaObject был ликвидирован с новой версией Scala

<2 >

Ответ 1

ScalaObject вставляет метод $tag, который, согласно комментарию в исходном коде библиотеки для версии 2.7, необходим для оптимизируя выражения соответствия шаблонов, которые соответствуют конструкторам классов case. "Поскольку имя начинается с $, его, конечно, следует считать" скрытым" для прикладных программистов. В Scala 2.8, он полностью пуст, поэтому я предполагаю, что он существует для обратной совместимости.

Ответ 2

Метод диспетчеризации не связывает структуру наследования класса, ищущую реализации. Компилятор создает таблицу диспетчеризации сетевых методов для каждого класса, которая отражает его сетевую переопределенную/унаследованную линию методов. Это одна из достоинств статического разрешения всего набора текста.

Ответ 3

Он также делает удобный крючок для статических анализов. Например, представьте, что у вас есть инструмент, который мог бы искать базу кода (скомпилированный или нет) и сказать вам, что вы можете улучшить некоторые показатели сплоченности/сочетания/баланса слоев/что-вы-вы, извлекая черту из этих классов и создать неявные преобразования для этих классов. Этот инструмент будет разумно сообщать только о чертах, которые можно было бы извлечь выгоду из классов, которые наследуют ScalaObject, а также сообщают о прибыльных неявных преобразованиях из любого класса Java. Тот же инструмент будет сообщать о любых возможных "нулевых" результатах из подклассов ScalaObject (где вариант или аналогичный вариант обычно является лучшим выбором), в то время как игнорирование null возвращается из классов Java.