Когда он говорит, что Scala не поддерживает множественное наследование, он ссылается на наследование реализации метода несколько раз. Конечно, вы можете реализовать несколько интерфейсов / признаков в классе, и они могут даже определять один и тот же метод, но вы не получите конфликта между различными реализациями из-за линеаризации признаков.
В общем, если у вас есть класс C1
с методом f()
и класс C2
с методом f()
, то множественное наследование означает, что вы можете каким-то образом наследовать обе реализации f()
. Это может привести к различным проблемам, которые Scala решает, позволяя вам наследовать только от одного класса, а в случае нескольких признаков - выбирать одну реализацию на основе порядка признаков.
Что касается Nothing
вещей действительно просто, потому что ничто не имеет никаких атрибутов или методов, определенных. Таким образом, вы не можете иметь никаких конфликтов наследования. Но я предполагаю, что большая часть вашего удивления исходит из другого понимания множественного наследования.
Как только вы поймете, что линеаризация признаков эффективно устраняет любую двусмысленность наследования, и что мы не будем ссылаться на наследование от нескольких признаков как множественное наследование из-за этого, у вас все будет в порядке.
Что касается того, как это реализовано: компилятор в конечном итоге несет ответственность за это. См. Соответствие спецификации языка Scala в разделе 3.5.2, которое среди прочих свойств включает в себя:
For every type constructor T (with any number of type parameters), scala.Nothing <: T <: scala.Any.
Или, другими словами, если вы хотите правильно реализовать компилятор, он должен обрабатывать Nothing
как подтип все по спецификации. По очевидным причинам Nothing
не определено расширение из всех классов, загруженных в систему, но актуальность определения в Nothing
качестве подтипа ограничена всеми местами, где подтип является релевантным.
Важным моментом здесь является то, что не существует экземпляра типа Nothing
, следовательно, его обработка строго ограничена проверкой типов, которая находится в области компилятора.