Scala:类型不匹配(Any *)=>单元

时间:2018-03-27 15:56:37

标签: scala variadic-functions

我有一个抽象的方法

def updateState: (Any*) => Unit

我试图通过以下方式覆盖子类:

override def updateState = (sharedOptimizer: Vector[Double],
                            sharedMeanGradient: Vector[Double],
                            sharedHistoricalGradients: Array[Vector[Double]]) => {
    ()
}

我不明白为什么编译器会给我这个错误:

Error:(75, 81) type mismatch;
 found   : (Vector[Double], Vector[Double], Array[Vector[Double]]) => Unit
 required: Any* => Unit

类型Any*是不是应该表示“任何类型的任意数量的参数”?

1 个答案:

答案 0 :(得分:2)

类型Any*只是普通类型,就像IntList[String]一样。 正如你无法覆盖方法

def foo(x: List[String]): Unit

通过

def foo(x: Int): Unit

您也无法覆盖

def updateState: (Any*) => Unit

通过

def updateState:
 (Vector[Double], Vector[Double], Array[Vector[Double]]) => Unit

因为(Vec[D], Vec[D], Arr[Vec[D]])不是Any*的超类型,即有许多内容可以作为Any*传递,而不是(Vec[D], Vec[D], Arr[Vec[D]])

如果您不想立即对状态类型进行硬编码,请通过它对您的类进行参数化:

trait Foo[S] {
  def updateState: S => Unit
}

或将其变成类型成员:

trait Foo {
  type State
  def updateState: State => Unit
}

然后你可以在子类中覆盖它:

object Bar extends Foo[Int] {
  override def updateState: Int => Unit = 
    x => println("State is now " + x)
}

object Bar extends Foo {
  type State = Int
  override def updateState: Int => Unit = ???
}

取决于您选择的选项。