2014-11-22 4 views
-1

У меня есть следующие определения:Передача объектов в случае Scala

sealed trait MyTrait 
case object One extends MyTrait 
case object Two extends MyTrait 

object Test extends (MyTrait => MyTraitReturnVal) { 

    def apply(myTrait: MyTrait) = { ... } 

    def myMethod(myTrait: MyTrait) = { 
    ... 
    } 
} 

Когда я звоню Test (один), он жалуется, что он ожидает интерфейс вместо конкретного типа. Любые предложения о том, как обойти это?

Так телефону:

Test(One) 

Жалуется, что он ожидает MyTrait и фактический параметр One.type!

+1

Какое точное сообщение об ошибке, на какой именно строке кода? – sjrd

+1

Как реализовать эту функцию? (Или почему «myMethod» находится в примере кода?) –

+0

Работает ли он, если вы добавляете подсказку типа, например: «Test (One: MyTrait)»? Существуют ли другие объекты, классы с именем «Один»? –

ответ

1

Вы наследуете объект Test из класса Function1, поэтому вам нужно реализовать метод 'apply' вместо 'myMethod'. Этот код компилируется и запускается:

sealed trait MyTrait 
    case object One extends MyTrait 
    case object Two extends MyTrait 

    case class MyTraitReturnVal(my: MyTrait) 

    object Test extends (MyTrait => MyTraitReturnVal) { 
    def apply(myTrait: MyTrait) = 
     new MyTraitReturnVal(myTrait) 
    } 

    println(Test(One)) 
    println(Test(Two)) 
+0

У меня есть приложение. Но это не проблема. – sparkr

+0

У меня есть запечатанные черты и объекты корпуса внутри объекта пакета по умолчанию. Возможно, это причина, по которой я получаю ошибку компиляции? – sparkr

+3

Нет, не следует. Трудно сказать, что именно не так, без «реального» кода. Можете ли вы создать gist с полным кодом и разделить его на файлы. –

Смежные вопросы