2012-05-12 11 views
5

Im lettura di questa pagina http://www.scala-lang.org/node/137, ho capito che cosa covarianza è e limiti inferiori pure, ma ciò che non è chiaro è questa linea:Scala tipo inferiore limiti e le covarianza

Purtroppo, questo programma non si compila, perché un'annotazione di covarianza è possibile solo se la variabile di tipo viene utilizzata solo nelle posizioni covariant . Poiché la variabile di tipo T appare come un tipo di parametro di metodo anteposto, questa regola è interrotta.

perché elem deve essere un'istanza di un supertipo di T, se ListNode è già covariant perché elem non può precedere l'elenco corrente.

+0

La spiegazione è abbastanza semplice. Digitare la variabile T come un tipo di parametro. Questa non è una posizione covariante. Cosa pone esattamente un problema qui? –

risposta

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 

Immaginate la seguente fu permesso:

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

Dal Foo è covariante su T, questo è valido (un semplice upcast, dal momento che un Foo[Sub] è un Foo[Super]):

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

Ora foo è, per quanto ne sappiamo, uno Foo[Super] come qualsiasi altro, ma è il suo bar metodo non funziona, perché l'implementazione bar richiede un Sub:

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

Ok, capisco, ora dalla riga 'questo programma non compila' forma il sito scala, non significa che stiamo effettivamente violando qualcosa in questo particolare codice e non stiamo sottoclasse Foo [SomeClass] esplicitamente, il compilatore sta solo proteggendo da un potenziale errore di runtime, ho sbagliato? – loki

+0

Hai ragione, ma è come se il compilatore applicasse qualsiasi altra regola di digitazione statica, come se non ti permettessi di chiamare i metodi Elenco su Stringhe. Come mostrato sopra, sarebbe logicamente incoerente permettere che l'argomento di un metodo sia un tipo covariante, quindi non lo consente. –

Problemi correlati