Когда он говорит, что 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, следовательно, его обработка строго ограничена проверкой типов, которая находится в области компилятора.