2012-01-07 6 views
8

Dato il seguente codice:Perché non è possibile eseguire l'override di un tipo astratto già implementato?

class A { 

    class B 

    type C <: B 

    trait D 

} 

class E extends A { 

    type C = B 

} 

class F extends E { 

    override type C = B with D 

} 

Perché il compilatore presentazione del Scala IDE all'interno della Eclipse Indigo IDE si lamentano con il messaggio di errore tipo prioritario C in classe E, che è uguale a F.this.B; il tipo C ha il tipo incompatibile?

Dopo che tutta la classe "B" è stata "modificata" con la caratteristica "D" e quindi le due definizioni di tipo sono dello stesso tipo di base, che è "B". Quindi definizioni di tipi compatibili.

Il codice seguente funziona. Considero le regole per tipo di assegnazione simile a assegnazione di variabili, come ad esempio:

class Foo 

trait Bar 

val a: Foo = new Foo 

val fooWithBar: Foo = new Foo with Bar 

è la mia comprensione che non va?

+1

Foo with Bar è un sottotipo di Foo. Questo non è ciò che il problema è. Non è consentito ridefinire un membro del tipo mentre è fisso, anche in un sottotipo. Se avessi la barra della classe che estende Foo, non puoi ridefinire neanche un membro del tipo da Foo a Bar. –

risposta

13

Essi non sono compatibili, di tipo C può essere usato in una posizione controvariante

class E extends A { 
    type C = B 
    def f(c: C) 
} 


class F extends E { 
    override type C = B with D 
    def f(c: ???) 
} 

Complemento dato e: E, si è permesso di chiamare e.f(new B). Cosa succede se e era val e = new F?

+0

Perché questa costellazione non dovrebbe essere corretta finché il tipo "C" sottoposto a override è ulteriormente limitato e mantiene il suo tipo di base "B". Se il metodo "f" accetta "B" s perché non dovrebbe accettare sottoclassi di questo, come per la ridefinizione "B con D" s? –

+3

Se il metodo accetta B, certamente deve accettare sottotipi. Il problema è che le istanze di F richiedono B con D, e quindi non accettano più il semplice B. Un sottotipo di E deve accettare B in f. Ovviamente accetta sottotipi. Non può richiedere che l'argomento sia un sottotipo. –

+0

Non sono sicuro che questo sia l'esempio di contatore corretto. Ecco perché: (scusate, disprezzo, stavo cercando di colpire annullare sul mio telefono, ma è stato pubblicato invece ..) –