3

我有一个简单的容器特征,如下所示:

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)

为什么是这样?我可以修复这个编译器错误吗?

4

3 回答 3

6

几乎相同的问题有正确答案

您可以使用特征类型参数,而不是方法类型参数:

trait Handler[Out] {
  def apply[In](in: In): Out
}

new Handler[Unit] {
  def apply[In](in: In) = println(in)
}
于 2013-05-21T10:49:06.420 回答
0

首先,您不能使用抽象(未实现)方法创建类,您应该在关键字之前class更改trait或添加。abstractclass

当您实现 apply 方法时,Unit是此方法的类型变量,并且 scala 将您的方法的类型推断为 scala.Unit 因为它是Predef.println方法的结果类型

于 2013-05-21T10:36:10.523 回答
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)
}
于 2013-05-21T15:00:40.497 回答