2015-03-30 9 views
5

Po przejrzeniu kilku przykładów, muszę powiedzieć, że nie rozumiem, co przynosi polimorfizm F-Bounded.wyjaśnienie typów objaśnienia scala f

By posłużyć się przykładem ze szkoły Scala (https://twitter.github.io/scala_school/advanced-types.html#fbounded)

Wyjaśniają, że potrzebują pewnego rodzaju F-ograniczony tak, że podklasa może wrócić podtypu. Tak robią coś takiego:

trait Container[A <: Container[A]] extends Ordered[A] 
class MyContainer extends Container[MyContainer] { 
    def compare(that: MyContainer) = 0 
} 

Ale nie widzę, jaki jest zysk z użyciem tego rodzaju typu, kiedy można użyć coś takiego:

trait Container[A] extends Ordered[A] 
class MyContainer extends Container[MyContainer] { 
    def compare(other: MyContainer) = 0 
} 

Każde wyjaśnienie jest bardzo mile widziane

Dzięki

Odpowiedz

4

zaletą przyjdzie, gdy wygląda mniej więcej tak:

trait Container[A <: Container[A]] extends Ordered[A] { 
    def clone: A 
    def pair: (A, A) = (clone, clone) 
} 

class MyContainer extends Container[MyContainer] { 
    def clone = new MyContainer 
} 

Teraz otrzymujesz bezpłatnie pair, a otrzymasz poprawny typ zwrotu. Bez czegoś takiego musisz ręcznie przesłonić każdą metodę, która zwraca ten sam typ (wiele niepotrzebnych elementów), lub tracisz swoistość w swoich typach, gdy tylko wywołasz metodę niezastosowaną.

+1

Myślę, że mam punkt Nishana i dla mnie ma to sens, ale część, o której mówisz, jest częścią, która mnie wprawia w zakłopotanie. Z twojego przykładu możesz zdefiniować A like: trait Container [A] i uzyskać taki sam wynik. Nie będziesz musiał nadpisywać funkcji pary w sublimasie –

+0

Och, nieważne, właśnie to dostałem. Jeśli zrobisz cechę Container [A], nie możesz zagwarantować, że w podklasie zwracany typ A jest typu Container. Wielkie dzięki –

1

W Scali możesz ustawić parametry swojego typu ograniczone przez typ związany. Tutaj w swojej pierwszej metodzie tworzysz parametr type, tworząc górną granicę z podklasą Container.

Za pomocą pierwszej metody nie można przekazać parametru w klasie kontenera, która nie jest podklasą klasy kontenera.

W twoim drugim przykładzie możesz przekazać instancję typu parametru dowolnej klasy. Więc tutaj nie ograniczasz niczego, podczas gdy w pierwszym przykładzie ograniczasz typ podrzędny klasy Container.