2

私はこの簡単なコードを持っています:

import java.util
import scala.collection.JavaConversions._

def f(x: util.List[Int]): Array[Int] = {
  x.toArray[Int]
}

失敗していますerror: missing arguments for method toArray in trait List

ただし、ソースコードtoArrayは次のとおりです。

trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
...
  def toArray[B >: A : ClassTag]: Array[B] = {
    if (isTraversableAgain) {
      val result = new Array[B](size)
      copyToArray(result, 0)
      result
    }
    else toBuffer.toArray
  }

したがって、明らかに議論の欠落はありません。

1) それはどのように可能ですか? 簡単な回避策はありますか?または、何か不足していますか?

2) エラーメッセージは に続きますfollow this method with '_' if you want to treat it as a partially applied function。ばかげた提案だと思いませんか?戻り値を宣言しているため、部分的に適用された関数は動作しません。コンパイラはそれを見るはずです。

4

1 に答える 1

3

これは、 が独自のメソッドをjava.util.List既に定義していることが原因のようです。toArrayと を定義toArray():ObjecttoArray(T[]):T[]ます。これらが利用可能であるため、 Scala への暗黙的な変換は行われませんList。しかし、toArray()Java のメソッドにListは期待される戻り値の型がないため、代わりに (ジェネリックな戻り値の型で) 単一の引数を取るメソッドを使用する必要があります。これが、このエラー メッセージが表示される理由です。

Scala への明示的な変換を行うと、目的のメソッドListが見つかり、期待どおりに動作するはずです。toArrayしたがって、コードは次のようになります。

import java.util
import scala.collection.JavaConverters._

def f(x: util.List[Int]): Array[Int] = {
  x.asScala.toArray[Int]
}
于 2015-03-05T20:07:05.577 に答える