2011-09-30 14 views
15

Istnieją dwa możliwe sposoby wyrażania abstrakcji nad typami.Czy istnieje przykład użycia abstrakcyjnego typu scala, którego nie można uzyskać przy pomocy leków generycznych?

abstract class Buffer { 
    type T 
    val element: T 
} 

raczej niż generics, np.

abstract class Buffer[T] { 
    val element: T 
} 

Rozumiem korzyści płynące z używania różnych podejść w różnych kontekstach. Ale interesują mnie przykłady, w których absolutnie niemożliwe jest przekonwertowanie wersji abstrakcyjnej na wersję ogólną.

Fragmenty kodu PS są mile widziane.

Odpowiedz

10

Typy abstrakcyjne mogą być powiązane z typami zależnymi od ścieżki, co nie jest możliwe w przypadku parametrów typu. W ten sposób możesz np. realizacji streszczenie typu z betonu klasy wewnętrzna:

trait A { type T } 
class B extends A { class T } 

lub wyraźnie wiążą się do typu zależnego od drogi wewnątrz zakresu klas:

class C { type T = this.type } 
class D { object Q; type T = Q.type } 
2
// This is possible 
trait M { type TM } 
trait P[TP] extends M { type TM = TP } 

// This is not 
trait P[TP] 
trait M extends P[TM] { type TM } 
+0

Ale czego właściwie nie mogę zrobić z lekami generycznymi? 1. przykład łatwo można przekonwertować na "cechę M [TM]; cecha P [TP] rozszerza M [TP]". 2. Po prostu nie kompiluje się, więc nic do konwersji ... – yura

5

Kolejna różnica: jedynego typu parametry mogą być wykorzystane jako samo- typy,

abstract class Buffer[T] { self: T => 
    val element: T 
} 
Powiązane problemy