2010-05-11 7 views
3

Compte tenu de ceci:incompatibilité auto-type dans Scala

abstract class ViewPresenterPair { 
    type V <: View 
    type P <: Presenter 

    trait View {self: V => 
    val presenter: P 
    } 

    trait Presenter {self: P => 
    var view: V 
    } 
} 

Je suis en train de définir une mise en œuvre de cette manière:

case class SensorViewPresenter[T] extends ViewPresenterPair { 
    type V = SensorView[T] 
    type P = SensorPresenter[T] 

    trait SensorView[T] extends View { 
    } 

    class SensorViewImpl[T](val presenter: P) extends SensorView[T] { 
    presenter.view = this 
    } 

    class SensorPresenter[T] extends Presenter { 
    var view: V 
    } 
} 

Ce qui me donne les erreurs suivantes:

error: illegal inheritance; 
self-type SensorViewPresenter.this.SensorView[T] does not conform to SensorViewPresenter.this.View's selftype SensorViewPresenter.this.V 
     trait SensorView[T] extends View { 
            ^
<console>:13: error: type mismatch; 
found : SensorViewPresenter.this.SensorViewImpl[T] 
required: SensorViewPresenter.this.V 
     presenter.view = this 
         ^
<console>:16: error: illegal inheritance; 
self-type SensorViewPresenter.this.SensorPresenter[T] does not conform to SensorViewPresenter.this.Presenter's selftype SensorViewPresenter.this.P 
     class SensorPresenter[T] extends Presenter { 
             ^

Je ne comprends pas pourquoi. Après tout, V est juste un alias pour SensorView[T], et les chemins sont les mêmes, alors comment peut-il ne pas être conforme?

Répondre

3

Trouvé: bien sûr, les paramètres T dans les types génériques sont différents. Donc j'aurais dû écrire à la place

case class SensorViewPresenter[T] extends ViewPresenterPair { 
    type V = SensorView 
    type P = SensorPresenter 

    trait SensorView extends View { 
    } 

    class SensorViewImpl(val presenter: P) extends SensorView { 
    presenter.view = this 
    } 

    class SensorPresenter extends Presenter { 
    var view: V 
    } 
}