2015-03-13 4 views
4

Следующий код не компилируется:Почему я не могу использовать объект случай как полиморфного типа

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] { 

Итак, как использовать объект случай как полиморфный тип? ^

+1

У вас есть свой ответ, но вы могли бы разместить ошибки компиляции. Из-за них «Yo не принимает параметры типа», которые указывали бы вам в правильном направлении. Затем следующая ошибка «не найдена: введите BBB», что является еще одним сильным намеком на то, что объект не является типом. И так далее. –

ответ

6

Как @endeneu упоминает, для случая объектов необходимо использовать .тип, также называемый одноплодную аннотация типа:

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

Вы пытаетесь создать экземпляр анонимного класса, придав ему параметр типа, но ваша черта не принимает один trait Yo должен быть trait Yo[TYPE], второй вы расширяете функцию от AAA до String, так что вы должны обеспечить возможность обращения Способ для этого, третий для случая объекты, которые вы должны использовать .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 = ??? 
} 

Edit: я не заметил, что ты хотел сделать его полиморфные, в этом случае просто удалите параметр типа от признака, вы не все равно использовать его:

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 = ??? 
} 
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) 
Смежные вопросы