【问题标题】:Found scala.Unit, required Unit找到 scala.Unit, 需要的 Unit
【发布时间】:2013-05-16 01:55:06
【问题描述】:

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

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)

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

【问题讨论】:

标签: scala types


【解决方案1】:

正确的answer几乎有相同的问题。

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

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

new Handler[Unit] {
  def apply[In](in: In) = println(in)
}

【讨论】:

  • 谢谢,这就行了。我曾尝试将InOut 作为特征类型参数,但这变得非常复杂。这行得通。再次感谢。
【解决方案2】:

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

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

【讨论】:

  • 对不起,我应该更具体一点:它实际上是一个特征。至于你的第二点,我如何避免使用Unit 类型变量而实际使用scala.Unit
【解决方案3】:

这个解决方案怎么样?

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

【讨论】:

  • 问题似乎在于输出类型是Handler.Out,而不是实际使用的输出类型。
  • 是的,但它是一个 Unit,您可以毫无问题地分配它: val h : Unit = res0("what ever")(假设 res0 是 Handler 创建的结果)
猜你喜欢
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
相关资源
最近更新 更多