为什么我不能将case对象用作多态类型

时间:2015-03-13 12:57:39

标签: scala

以下代码无法编译:

  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对象用作多态类型?                            ^

3 个答案:

答案 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)