Cuando dice que Scala no admite la herencia múltiple, se refiere a heredar la implementación de un método varias veces. Por supuesto, puede implementar múltiples interfaces / rasgos en una clase, e incluso pueden definir el mismo método, pero no obtiene un conflicto entre las diferentes implementaciones debido a la linealización de rasgos.
En general, si tiene una clase C1
con un método f()
y una clase C2
también con un método f()
, la herencia múltiple significa que de alguna manera puede heredar ambas implementaciones de f()
. Esto puede conducir a varios problemas, que Scala resuelve al solo dejarle heredar de una sola clase y en el caso de múltiples rasgos seleccionando una implementación basada en el orden de los rasgos.
En cuanto a las Nothing
cosas, son realmente simples, porque nada tiene atributos o métodos definidos. Por lo tanto, no puede tener ningún conflicto de herencia. Pero supongo que la mayor parte de su sorpresa proviene de una comprensión diferente de la herencia múltiple.
Una vez que comprenda que la linealización de rasgos elimina efectivamente cualquier ambigüedad de la herencia, y que no nos referimos a heredar de múltiples rasgos como herencia múltiple debido a eso, entonces debería estar bien.
En cuanto a cómo se realiza esto: el compilador finalmente es responsable de esto. Consulte la sección de especificación del lenguaje Scala 3.5.2 conformidad, que entre otras propiedades incluye:
For every type constructor T (with any number of type parameters), scala.Nothing <: T <: scala.Any.
O, en otras palabras, si desea implementar un compilador correctamente, debe manejarse Nothing
como un subtipo de todo por especificación. Por razones obvias, Nothing
no está definido para extenderse desde todas las clases cargadas en el sistema, pero la relevancia de definir Nothing
como subtipo está limitada a todos los lugares, donde el subtipo es relevante.
Un punto importante aquí es que no existe una instancia de tipo Nothing
, por lo tanto, su tratamiento se limita estrictamente a la verificación de tipo, que está en el ámbito del compilador.