我有一个简单的容器特征:
trait Handler {
def apply[In, Out](in: In): Out
}
当我尝试实施它时:
new Handler {
def apply[Any, Unit](in: Any) = println(in)
}
我收到错误:
[error] found : scala.Unit
[error] required: Unit(in method apply)
[error] def apply[Any, Unit](in: Any) = println(in)
这是为什么?我可以修复此编译器错误吗?
答案 0 :(得分:5)
正确的answer几乎存在相同的问题。
您可以使用特征类型参数,而不是方法类型参数:
trait Handler[Out] {
def apply[In](in: In): Out
}
new Handler[Unit] {
def apply[In](in: In) = println(in)
}
答案 1 :(得分:0)
首先,您无法使用抽象(未实现)方法创建类,您应该将class
更改为trait
或在abstract
之前添加class
关键字。
当您实现apply方法时,Unit
是此方法的类型变量,而scala将方法的类型推断为scala.Unit,因为它是Predef.println
方法的结果类型
答案 2 :(得分:0)
这个解决方案怎么样?
trait Handler {
type In
type Out
def apply(in: In): Out
}
new Handler {
type In=Any
type Out=Unit
override def apply(in: In):Out = println(in)
}