Как я могу привести объект в качестве параметра Function1 [Array [_], Unit] inScala - PullRequest
0 голосов
/ 29 февраля 2012
class MyClass(functions: Seq[Function1[Array[_], Unit]) {
  def foo(parametersForEachFunction: Seq[Array[_]]) {
    assert(functions.size == parametersForEachFunction.size)
    for ((function, parameter) <- functions zip parametersForEachFunction) {
      // Assume each parameter is suitable for the funcition
      // What type parameter I should wrote in asInstanceOf?
      function(parameter.asInstanceOf[ ?????? ])
    }
  }
}

Я знаю, что asInstanceOf требуется здесь, но я не знаю, какой параметр типа я должен записать в asInstanceOf.

Ответы [ 3 ]

0 голосов
/ 29 февраля 2012

Если вам нужно разыграть, вы делаете это неправильно. Всякий раз, когда вы думаете, что должны что-то разыграть, откатитесь и попробуйте что-нибудь еще. Существуют исключения - если документация о чем-то явно скажет вам разыграть, ну, вы должны разыграть. Но не рассчитывайте на у вас есть такое исключение: вы, вероятно, этого не сделаете.

Как и в этом случае.

scala> class MyClass(functions: Seq[Function1[Array[_], Unit]]) {
     |   def foo(parametersForEachFunction: Seq[Array[_]]) {
     |     assert(functions.size == parametersForEachFunction.size)
     |     for ((function, parameter) <- functions zip parametersForEachFunction) {
     |       function(parameter)
     |     }
     |   }
     | }
defined class MyClass
0 голосов
/ 29 февраля 2012

Возможно, вы хотите Function1, так как вы хотите передать один параметр.Function0, как следует из названия, принимает нулевые параметры.Я предпочитаю использовать от A => B до Function1[A,B], поэтому я напишу это так.(Обратите внимание, что все функции имеют одно возвращаемое значение.)

class MyClass(fns: Seq[Array[_] => Unit]) {
  def foo(parms: Seq[Array[_]]) {
    for ((f,p) <- fns zip parms) {
      f(p)
    }
  }
}

Кроме того, Array и только Array не является универсальным.Вы не можете передать Array[Int] или Array[String] для Array[_].Таким образом, вышеприведенное, вероятно, не делает то, что вы хотите:

scala> new MyClass(Seq((a: Array[_]) => println(a.length)))
res0: MyClass = MyClass@3fee3c8d

scala> new MyClass(Seq((a: Array[String]) => println(a.mkString)))
<console>:9: error: type mismatch;
 found   : Array[String] => Unit
 required: Array[_] => Unit
              new MyClass(Seq((a: Array[String]) => println(a.mkString)))

scala> new MyClass(Seq(((a: Array[String]) => println(a.mkString)).asInstanceOf[Array[_]=>Unit]))
res4: MyClass = MyClass@4b9cee52

scala> new MyClass(Seq(((a: Array[Int]) => println(a.sum)).asInstanceOf[Array[_]=>Unit]))
res5: MyClass = MyClass@2357f593

scala> res5.foo(Seq(Array(1,2,3).asInstanceOf[Array[_]]))
6

Тьфу!Может быть, вы можете найти другой способ представить то, что вы хотите?(Так как я не знаю ваш вариант использования, я стесняюсь рекомендовать что-нибудь.)

0 голосов
/ 29 февраля 2012

Function0 принимает только один тип параметра, поэтому не уверен, что вы делаете.

Если вы думаете о передаче произвольного аргумента произвольной арности функций, вы, вероятно, можете заглянуть в Function2curried и т. д. Function объекта * tupled.Я смутно припоминаю, что скалаз мог делать подобные вещи из коробки, но не уверен.

...