Как я могу привести параметр к «Array [(некоторый другой) _0 (в значении $ anonfun)]» в Scala? - PullRequest
0 голосов
/ 01 марта 2012

У меня есть такой код:

case class FunctionCommand[A](function: Function1[Array[A], Unit])

class MyClass(commands: List[FunctionCommand[_]]) {
  def foo(parametersForEachFunction: Seq[Array[_]]) {
    assert(commands.size == parametersForEachFunction.size)
    for ((command, parameter) <- commands zip parametersForEachFunction) {
      command.function(parameter)
    }
  }
}

и не компилируется:

MyClass.scala:7: type mismatch;
found   : Array[(some other)_0(in value $anonfun)] where type (some other)_0(in value $anonfun)
required: Array[_0(in value $anonfun)] where type _0(in value $anonfun)
       command.function(parameter)
                        ^

Интересно, что такое Array[(some other)_0(in value $anonfun)]. Могу ли я написать что-то вроде command.function(parameter.asInstanceOf[????]) чтобы компилировать?

У меня есть обходной путь. Я заменяю command.function(parameter) на:

def forceInvoke[A](command: FunctionCommand[A], parameter: Any) {
  command.function(parameter.asInstanceOf[A])
}
forceInvoke(command, parameter)

И он компилируется.

Но я все еще хочу знать, есть ли способ привести parameter к правильному типу во время выполнения встроенным образом.

Ответы [ 2 ]

3 голосов
/ 01 марта 2012

Ваша проблема в том, что вашему FunctionCommand#function требуется правильно параметризованный массив, в то время как вы не можете доказать, что параметр в parametersForEachFucntion имеет правильный тип.Вы также не можете сделать это во время выполнения из-за стирания типа.

Следующее работает, отказавшись от параметризации (хотя это фактически то, что вы имели в предыдущем вопросе):

case class FunctionCommand(function: Function1[Array[_], Unit])

class MyClass(commands: List[FunctionCommand]) {
  def foo(parametersForEachFunction: Seq[Array[_]]) {
    assert(commands.size == parametersForEachFunction.size)
    for ((command, parameter) <- commands zip parametersForEachFunction) {
      command.function(parameter)
    }
  }
}

val fc = FunctionCommand(xs => xs foreach println)
val mc = new MyClass(List(fc))

scala> mc.foo(List(Array(1,2,3)))
1
2
3
1 голос
/ 02 марта 2012

Достаточно написать это так:

for ((command: FunctionCommand[_], parameter) <- commands zip parametersForEachFunction) {
  command.function(parameter)
}
...