2011-09-30 19 views
15

Hay dos formas posibles de expresar abstracción sobre tipos.¿Hay algún ejemplo de uso de tipo abstracto Scala que sea imposible de lograr con los genéricos?

abstract class Buffer { 
    type T 
    val element: T 
} 

rather than generic, p. Ej.

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

Entiendo los beneficios en usabilidad del uso de diferentes enfoques en diferentes contextos. Pero me interesan los ejemplos en los que es absolutamente imposible convertir la versión de Abstract Type a Generic.

Los fragmentos de código PS son bienvenidos.

Respuesta

10

Los tipos abstractos pueden vincularse a los tipos de ruta que no es posible con los parámetros de tipo. Por lo tanto, puedes, por ejemplo, aplicar un tipo abstracto con una clase interna de hormigón:

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

o explícitamente enlazarlo a un tipo dependiente de la trayectoria dentro de la clases alcance:

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

¿Pero qué realmente no puedo hacer con los genéricos? 1. el ejemplo se puede convertir fácilmente en "rasgo M [TM]; rasgo P [TP] se extiende M [TP]". 2. Simplemente no compila, entonces nada para convertir ... – yura

5

Otra diferencia: único tipo parámetros se pueden utilizar como auto tipos,

abstract class Buffer[T] { self: T => 
    val element: T 
} 
Cuestiones relacionadas