2012-05-12 18 views
5

Im lectura de esta página http://www.scala-lang.org/node/137, entiendo lo que la covarianza es y límites inferiores también, pero lo que no está claro es esta línea:límites Scala tipo inferior y la covarianza

Desafortunadamente, este programa no se compila, porque una anotación de covarianza solo es posible si la variable de tipo solo se utiliza en las posiciones covariantes . Dado que la variable de tipo T aparece como un tipo de parámetro del método anteponer, esta regla se rompe.

qué elem Tiene que haber una instancia de un supertipo de T, si ListNode ya es covariante qué elem no es posible anteponer a la lista actual.

+0

La explicación es bastante sencillo. La variable de tipo T aparece como un tipo de parámetro. Esta no es una posición covariante. ¿Qué plantea exactamente un problema aquí? –

Respuesta

2
class Super    {override def toString = "Super"} 
class Sub extends Super {override def toString = "Sub"; def subMethod {} } 
val sup = new Super 
val sub = new Sub 

imaginar los siguientes fueron permitidas:

// invalid code 
class Foo[+T] { 
    def bar(x: T) = println(x) 
} 

Desde Foo es covariante en T, esto es válido (un upcast simple, ya que un Foo[Sub] es una Foo[Super]):

val foo : Foo[Super] = new Foo[Sub] { 
    override def bar(x: Sub) = x.subMethod 
} 

Ahora foo es, hasta donde sabemos, un Foo[Super] como cualquier otro, pero es bar método no funcionará, ya que la aplicación requiere un barSub:

foo.bar(sup) // would cause error! 
+0

Ok, lo entiendo, ahora desde la línea 'este programa no compila' desde el sitio de scala, no significa que realmente estemos violando algo en este código en particular y no estamos subclasificando Foo [SomeClass] explícitamente, el compilador solo está protegiendo contra un posible error de tiempo de ejecución, ¿estoy equivocado? – loki

+0

Tiene razón, pero es como si el compilador aplicara cualquier otra regla de tipeo estático, como no permitirle llamar a los métodos List en Strings. Como muestra lo anterior, sería lógicamente inconsistente permitir que el argumento de un método sea de tipo covariante, por lo que no te permite hacerlo. –

Cuestiones relacionadas