Почему существует "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.