2017-02-01 4 views
2

Gibt es eine Möglichkeit, auf ein Member vom Typ "Abstract" zuzugreifen? Wie würde ich einen Typ für AFoo und Bar definieren?Angeben von abstrakten Typmembern

trait Foo { 
    type A 
} 

trait Bar { 
    type A 
} 

case class Qux() extends Foo with Bar { 
    type Foo#A = String 
    type Bar#A = Int 
} 

Antwort

3

Klasse Qux hat nur (und kann nur) eine einzige Definition von Typ A bieten die abstrakten Anforderungen von Foo und Bar,

case class Qux() extends Foo with Bar { 
    type A = Int 
} 

Wenn einer oder beide der Definitionen in Foo zu befriedigen und Bar sind Beton oder begrenzt, dann muss die Definition in Qux beide erfüllen, zum Beispiel

trait Foo { 
    type A <: AnyRef 
} 

trait Bar { 
    type A <: String 
} 

case class Qux() extends Foo with Bar { 
    type A = String // Bounded by both AnyRef and String 
} 

Da die Kreuzung von Int und String leer ist, ist es unwahrscheinlich, dass die Definitionen von Foo und Bar von ganz Form in Frage, was Sie suchen, jedoch ist folgende möglich,

trait Foo { 
    type A <: Int 
} 

trait Bar { 
    type A <: String 
} 

case class Qux() extends Foo with Bar { 
    type A = Int with String // Uninhabited type 
}