找到了scala.Unit,需要单位

时间:2013-05-21 10:20:06

标签: scala types

我有一个简单的容器特征:

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)

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

3 个答案:

答案 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)
}