Quando afferma che Scala non supporta l'ereditarietà multipla, si riferisce all'ereditarietà dell'implementazione di un metodo più volte. Naturalmente, è possibile implementare più interfacce / tratti in una classe e possono persino definire lo stesso metodo, ma non si crea un conflitto tra le diverse implementazioni a causa della linearizzazione dei tratti.
In generale, se hai una classe C1
con un metodo f()
e una classe C2
anche con un metodo f()
, l'ereditarietà multipla significa che puoi in qualche modo ereditare entrambe le implementazioni di f()
. Questo può portare a vari problemi, che Scala risolve solo lasciandoti ereditare da una singola classe e in caso di tratti multipli selezionando una implementazione in base all'ordine dei tratti.
Per quanto riguarda le Nothing
cose sono davvero semplici, perché nulla non ha attributi o metodi definiti. Quindi non puoi avere alcun conflitto ereditario. Ma presumo che la maggior parte della tua sorpresa provenga da una diversa comprensione dell'eredità multipla.
Una volta compreso che la linearizzazione dei tratti elimina effettivamente qualsiasi ambiguità dell'eredità e che non ci riferiamo all'ereditarietà da più tratti come eredità multipla a causa di ciò, allora dovresti andare bene.
Quanto a come questo viene realizzato: il compilatore è alla fine responsabile di questo. Vedere la conformità alla sezione 3.5.2 delle specifiche del linguaggio Scala , che tra le altre proprietà include:
For every type constructor T (with any number of type parameters), scala.Nothing <: T <: scala.Any.
O in altre parole, se si desidera implementare correttamente un compilatore, deve gestirlo Nothing
come sottotipo di tutto in base alle specifiche. Per ovvie ragioni, Nothing
non è definito per estendersi da tutte le classi caricate nel sistema, ma la rilevanza della definizione Nothing
come sottotipo è limitata a tutti i luoghi, dove il sottotipo è rilevante.
Un punto importante qui è che non esiste alcuna istanza di tipo Nothing
, quindi il suo trattamento è strettamente limitato al controllo del tipo, che è tutto nel regno del compilatore.