Scala:类型与(任意*)不匹配=>;单位
我有一个抽象的方法Scala:类型与(任意*)不匹配=>;单位,scala,variadic-functions,Scala,Variadic Functions,我有一个抽象的方法 def updateState: (Any*) => Unit 我正试图通过以下方式在子类中重写: override def updateState = (sharedOptimizer: Vector[Double], sharedMeanGradient: Vector[Double], sharedHistoricalGradients: Array[
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*
不是应该表示“任意类型的任意数量的参数”吗 类型Any*
只是一个普通类型,就像Int
或List[String]
一样。
正如不能重写方法一样
def foo(x: List[String]): Unit
借
您也不能覆盖
def updateState: (Any*) => 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)
}
或
取决于您选择的选项。类型
Any*
只是普通类型,就像Int
或List[String]
一样。
正如不能重写方法一样
def foo(x: List[String]): Unit
借
您也不能覆盖
def updateState: (Any*) => 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)
}
或
取决于您选择的选项。它的意思应该是这样的。那么,为什么您要尝试用一个方法来覆盖它,该方法只需要三个参数,分别是
Vector[Double]
、Vector[Double]
和Array[Vector[Double]]
?如果我想把System.out
和比萨饼
传递给它怎么办?二不等于三,并且“Pizza”
不是向量[Double]
,因此您的重写方法无法处理“Pizza”
,因此,它无法处理Any*
@andreytyukin,因为我希望扩展我的类的任何类都有一个方法updateState
,但根据子类的不同,实现是完全不同的。参数也可能不同。也许还有另一种更干净的方法,但我不知道。它应该是这个意思。那么,为什么您要尝试用一个方法来覆盖它,该方法只需要三个参数,分别是Vector[Double]
、Vector[Double]
和Array[Vector[Double]]
?如果我想把System.out
和比萨饼
传递给它怎么办?二不等于三,并且“Pizza”
不是向量[Double]
,因此您的重写方法无法处理“Pizza”
,因此,它无法处理Any*
@andreytyukin,因为我希望扩展我的类的任何类都有一个方法updateState
,但根据子类的不同,实现是完全不同的。参数也可能不同。也许还有另一种更干净的方法,但我不知道..类型成员的方法非常优雅,谢谢你的解决方案@Arthurdeschaps它更多地取决于类的使用方式,而不是类本身的内部结构。如果您经常希望从外部约束类型状态
,则更容易将其声明为类型参数。如果所有其他类通常不关心状态
是什么,则更容易将其保留为类型成员。希望这个附加的决策标准是有帮助的…类型成员的方法非常优雅,感谢您的解决方案@Arthurdeschaps它更多地取决于类的使用方式,而不是类本身的内部结构。如果您经常希望从外部约束类型状态
,则更容易将其声明为类型参数。如果所有其他类通常不关心状态
是什么,则更容易将其保留为类型成员。希望这一额外的决策标准有助于。。。