以下代码无法编译:
case object O
trait Show[A] {def show(a: A) : String}
class OShow extends Show[O] {
override def show(a: O): String = "ahoy"
}
编译错误是
Error: not found: type O
class OShow extends Show[O] {
那么,如何将case对象用作多态类型? ^
答案 0 :(得分:9)
正如@endeneu所提到的,对于你需要使用.type的case对象,也称为singleton类型注释:
class OShow extends Show[O.type] {
override def show(a: O.type): String = "ahoy"
}
答案 1 :(得分:2)
您正在尝试实例化一个匿名类,为其提供一个类型参数,但您的特征不需要trait Yo
应为trait Yo[TYPE]
,其次是您从AAA
扩展函数到String
所以你必须为它提供一个apply方法,第三个是你需要使用{1}}的case对象,也叫做singleton type annotation:
.type
如果您希望apply依赖于type参数,您应该这样做:
trait AAA
case object BBB extends AAA
case object CCC extends AAA
trait Yo[TYPE] extends (AAA => String)
def bb = new Yo[BBB.type] {
override def apply(v1: AAA): String = ???
}
编辑:我没注意到你想让它变成多态,在这种情况下只是从特征中删除type参数,你还是没有使用它:
trait Yo[TYPE] extends (TYPE => String)
def bb = new Yo[BBB.type] {
override def apply(v1: BBB.type): String = ???
}
答案 2 :(得分:0)
我不确定你想要达到的目的但也许这就是你要找的东西。
trait AAA
case class BBB(x: Int) extends AAA
case class CCC(x: String) extends AAA
trait Yo[T <: AAA] extends (T => String)
def bb = new Yo[BBB] { def apply(v1: BBB) = "BBB: " + v1.x}
def cc = new Yo[CCC] { def apply(v1: CCC) = "CCC: " + v1.x}
println(bb(BBB(5)), cc(CCC("foo"))) //(BBB: 5,CCC: foo)