2011-11-16 115 views
3

鉴于这个例子中引用抽象类型:从参数化类型

abstract class Base { type Value } 
case object Foo extends Base { type Value = String } 

case class Bar[A <: Base](a: A, value: A#Value) 

val x = Bar(Foo, "It's a Foo") // Won't compile with found String required ?#Value 

我想有该类型约束为value是相同类型A。即String因为我通过了Foo。我知道我可以用不同的方式进行建模,但很高兴知道它是否可能?

回答

2

作为一个起点,它编译并提供了一些你需要的约束条件。

abstract class Base { type Value } 
case object Foo extends Base { type Value = String } 

case class Bar[A <: Base, V <: A#Value](a: A, value: V) 

val x = Bar(Foo, "It's a Foo") 
+0

太棒了!非常感谢你。 – chrsan