以下のファクトリ メソッドに型パラメータを指定できないのはなぜですか?
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
import org.scalatest.FunSuite
@RunWith(classOf[JUnitRunner])
class WhyScalaNeverWillMakeIt extends FunSuite {
test("Array becomes ArraySeq when you least want it") {
val arr = Array("A", "B", "C")
def f: String => Dummy = new Dummy(_)
val bucket = new Bucket[Dummy](arr.map(f))
// val bucket2 = Bucket[String, Dummy](arr, f)
// val bucket3 = Bucket[Dummy](arr, f)
val bucket4 = Bucket(arr, f)
}
class Bucket[T]( val arr: Array[T] ) {/* Loads of business logic */}
object Bucket {
// def apply[T, U](arr: Array[T], f:T=>U):Bucket[U] = new Bucket[U](arr.map( b => f(b) ))
// def apply[T](arr: Array[String], f:String=>T):Bucket[T] = new Bucket[T](arr.map( b => f(b) ))
def apply(arr: Array[String], f:String=>Dummy):Bucket[Dummy] = new Bucket[Dummy](arr.map(f))
}
class Dummy(val name: String)
}
ファクトリ メソッドのコメントを外すと、次のobject Bucket
ようになります。
error: type mismatch;
found : scala.collection.mutable.ArraySeq[T]
required: Array[T]
def apply[T](arr: Array[String], f:String=>T):Bucket[T] = new Bucket[T](arr.map( b => f(b) ))
型パラメーター T を導入したときに、どういうわけか Scala コンパイラーが混乱しました (それは私ですか? ;-) )。戻り値の型を Array[T] から ArraySeq[T] に変更する必要があります。
Array は Java Array の単なるラッパーであり、おそらく Seq や List などのより高度な Scala クラスの 1 つを使用する必要があることはわかっていますが、それでもこのかなり奇妙な動作は説明できません。
なぜこれが起こっているのか、そしておそらくそれを修正する方法を誰かが説明できますか(まだ配列を使用しています)?
編集:私はscala 2.9.1を使用しています