2014-05-02 16 views
7

Dlaczego Scala Niektórzy nie dziedziczą z AnyVal, aby użyć funkcji typu wartości i zapisać koszty boksu?Opcja Scala? Dlaczego niektórzy nie dziedziczą AnyVal i dlaczego nie jest to typ wartości?

Coś jak:

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") 
} 

Odpowiedz

6

Z dokumentacji dla Value Classes:

Podsumowanie Ograniczenia

Klasa wartość

  • musi mieć tylko podstawowy konstruktora z dokładnie jeden publiczny, parametr val, którego typ nie jest klasą wartości. (Od wersji Scala 2.11.0, parametr może być niepubliczny.)
  • może nie mieć wyspecjalizowanych parametrów.
  • może nie mieć zagnieżdżonych lub lokalnych klas, cech lub obiektów.
  • może nie definiować metody równej lub hashCode.
  • musi być klasą najwyższego poziomu lub członkiem obiektu statycznie dostępnego.
  • może mieć tylko defs jako członków. W szczególności nie może mieć leniwych vals, vars ani vals jako członków.
  • nie może zostać przedłużony przez inną klasę.

Pogrubione nich wyklucza Some od bycia klasy wartości jak obecnie napisane. Drugą z nich można by prawdopodobnie zająć niewielką zmianą, ale pierwsza ją zabija. Nie można byłoby zawinąć innej klasy wartości w Some, jeśli niektóre z nich miałyby samą klasę wartości.

+1

ma sens, z wyjątkiem typów wartości, które działają poprawnie z ogólnymi parametrami, które mogą być klasą wartości. Przykład TestSome w OP, który rozszerza AnyVal, całkowicie kompiluje i działa z określoną przez użytkownika klasą wartości. – user2684301

+0

Być może to ograniczenie zostało zniesione. Ponadto 'Some' dziedziczy wiele cech kolekcji i mogą tam występować naruszenia innych ograniczeń typu Value Type. –

+1

Niektóre dziedziczą tylko opcję. Opcja dziedziczy dwie cechy - Product i Serializable - które dziedziczą Any. – user2684301

Powiązane problemy