Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:类型与(任意*)不匹配=>;单位_Scala_Variadic Functions - Fatal编程技术网

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它更多地取决于类的使用方式,而不是类本身的内部结构。如果您经常希望从外部约束类型
状态
,则更容易将其声明为类型参数。如果所有其他类通常不关心
状态
是什么,则更容易将其保留为类型成员。希望这一额外的决策标准有助于。。。