Quando ele diz que Scala não suporta herança múltipla, ele se refere à herança de uma implementação de método várias vezes. Obviamente, você pode implementar várias interfaces / características em uma classe e elas podem até definir o mesmo método, mas não há conflito entre as diferentes implementações devido à linearização de características.
Em geral, se você tem uma classe C1
com um método f()
e uma classe C2
também com um método f()
, a herança múltipla significa que você pode, de alguma forma, herdar as duas implementações de f()
. Isso pode levar a vários problemas, que o Scala resolve ao permitir que você herde apenas de uma única classe e, no caso de várias características, selecionando uma implementação com base na ordem das características.
Quanto às Nothing
coisas, são realmente simples, porque nada não possui atributos ou métodos definidos. Portanto, você não pode ter nenhum conflito de herança. Mas suponho que a maior parte da sua surpresa venha de um entendimento diferente da herança múltipla.
Depois de entender que a linearização de características elimina efetivamente qualquer ambiguidade da herança, e que não nos referimos à herança de múltiplas características como herança múltipla devido a isso, você deve ficar bem.
Quanto à forma como isso é realizado: o compilador é eventualmente responsável por isso. Consulte a seção 3.5.2 da especificação de idioma Scala , que entre outras propriedades inclui:
For every type constructor T (with any number of type parameters), scala.Nothing <: T <: scala.Any.
Ou, em outras palavras, se você deseja implementar um compilador corretamente, ele deve ser manipulado Nothing
como um subtipo de tudo por especificação. Por razões óbvias, Nothing
não está definido para estender-se a todas as classes carregadas no sistema, mas a relevância de definir Nothing
como subtipo é limitada a todos os locais onde a subtipagem é relevante.
Um ponto importante aqui é que não existe instância de tipo Nothing
, portanto, seu tratamento é estritamente limitado à verificação de tipo, que é tudo no domínio do compilador.