Perché i tipi Scala e Opzione di Scala non sono interfacce / tratti ma classi?

7

Volevo creare una classe CompileResult , che può essere trattata come un tipo E, ma ha alcuni metodi utili aggiuntivi. Dovrebbe essere un CompileSuccess o un CompileFailure (che ha anch'esso alcune funzionalità estese). Tuttavia, non posso farlo perché Either è un abstract class e non voglio estenderlo ma piuttosto usare la delega e avere un Either memorizzato internamente.

Quindi la mia domanda è: perché Either è una classe astratta ora (anche perché prima era un tratto) e perché non usavano un'interfaccia? Lo stesso vale anche per l'opzione.

    
posta valenterry 17.12.2014 - 16:30
fonte

1 risposta

10

La modifica a Either è stata apportata il 24 aprile 2008 in commit c0b21797bde81861305dd68853add2d8bd46e484 "Changed isLeft e isRight per utilizzare meno memoria. ":

Changed isLeft and isRight to use less memory.

Changed either from a sealed trait to a sealed abstract class to allow exhaustiveness checking.

All changes per the discussion in #797.

Il rapporto bug di riferimento è SI-797 "lazy vals in entrambi i casi dovrebbe probabilmente essere def" :

Questo commento di David R. MacIver è molto illuminante :

While I'm making suggestions, wouldn't it be better if Either were a sealed abstract class so you could get pattern match warnings?

Nota che nel frattempo fa Scala supporta i controlli esaustivi per sealed trait s e sealed abstract class es, quindi non sarebbe più necessario, tuttavia, c'è anche questo < a href="https://issues.scala-lang.org/browse/SI-797?focusedCommentId=41402#comment-41402"> commento di Geoffrey Alan Washburn :

Given that Left and Right are final, I cannot see any sensible way someone could be using Either as a mixin.

Quindi, ha ancora senso che Either non sia un trait .

Come per Option , era sealed in impegnare 0bef86d8e8b7ea7ebb790ebcec7fedcb9a24f5a8 il 9 marzo , 2006, tuttavia, era un abstract class anche prima di allora.

La modifica da trait a abstract class è stata effettuata in commit d7007f7a9607481eb73b8df587e3c52cf4272147 "Usa" classe mixin " invece di "tratto" " il 3 marzo 2006.

Per quanto riguarda il motivo per cui non sono interfacce, la risposta è piuttosto semplice: Scala non ha interfacce, almeno non nel senso di Java o C #.

    
risposta data 17.12.2014 - 17:49
fonte

Leggi altre domande sui tag