Why can't I use the case object as a polymorphic type

The following code does not compile:

  case object O

  trait Show[A] {def show(a: A) : String}

  class OShow extends Show[O] {
    override def show(a: O): String = "ahoy"
  }

Compilation error

Error: not found: type O
  class OShow extends Show[O] {

So how to use the case object as a polymorphic type? ^

+4
source share
3 answers

As @endeneu mentioned, for case objects you need to use .type, also called singleton type annotation:

class OShow extends Show[O.type] {
  override def show(a: O.type): String = "ahoy"
}
+6
source

, , trait Yo trait Yo[TYPE], -, AAA String, apply, case, .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 = ???
}

, , - :

trait Yo[TYPE] extends (TYPE => String)

def bb = new Yo[BBB.type] {
  override def apply(v1: BBB.type): String = ???
}

: , , , :

trait AAA
case object BBB extends AAA
case object CCC extends AAA

trait Yo extends (AAA => String)

def bb = new Yo {
  override def apply(v1: AAA): String = ???
}
+2

, , , , , .

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)
0

All Articles