2014-05-02 14 views
7

Perché Scala Alcuni non eredita da AnyVal in modo che utilizzi la funzionalità del tipo di valore e salvi i costi di boxe?Opzione Scala? Perché Some non eredita AnyVal e perché non è un tipo di valore?

Qualcosa di simile:

sealed trait TestOption[+A] extends Any { 
    def isEmpty: Boolean 
    def get: A 
} 

final case class TestSome[+A](val x: A) extends AnyVal with TestOption[A] { 
    def isEmpty = false 
    def get = x 
} 

case object TestNone extends TestOption[Nothing] { 
    def isEmpty = true 
    def get = throw new NoSuchElementException("None.get") 
} 

risposta

6

Dalla documentazione per Value Classes:

Sommario delle limitazioni

Una classe di valore

  • deve avere solo un costruttore principale esattamente un pubblico, val parametro il cui tipo non è una classe di valore. (Da Scala 2.11.0, il parametro potrebbe essere non pubblico.)
  • potrebbe non avere parametri di tipo specializzati.
  • non possono aver nidificato o classi locali, tratti, o oggetti
  • non può definire un pari o metodo hashCode.
  • deve essere una classe di livello o un membro di un oggetto staticamente accessibile
  • può avere solo defs come membri. In particolare, non può avere lazy vals, vars o vals come membri.
  • non può essere esteso da un'altra classe.

Quelli in grassetto esclude Some dall'essere una Classe Valore come attualmente scritta. Il secondo di questi potrebbe probabilmente essere affrontato con un leggero cambiamento, ma il primo lo uccide. Non saresti in grado di avvolgere un'altra classe di valore in Some se alcuni sono stati creati una classe di valore.

+1

che ha senso tranne che i tipi di valore funzionano bene con parametri generici che possono essere una classe di valore. L'esempio di TestSome nell'OP che estende AnyVal è totalmente compilato e funziona con una classe di valore definita dall'utente. – user2684301

+0

Forse questa restrizione è stata revocata. Inoltre, 'Some' eredita una serie di tratti di raccolta e potrebbero esserci violazioni di altri vincoli di tipo Value in agguato lì. –

+1

Alcuni ereditano solo l'opzione. L'opzione eredita due tratti - Prodotto e serializzabile - che ereditano entrambi. – user2684301

Problemi correlati