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