我有一个抽象的方法
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*
是不是应该表示“任何类型的任意数量的参数”?
答案 0 :(得分:2)
类型Any*
只是普通类型,就像Int
或List[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 = ???
}
取决于您选择的选项。