Scala2.9を使用しています
私はクラスを持っています:
class Queue[T] private( private val heading: List[T], private val trailing: List[T] ) {
def this( a: T* ) = this( a.toList, Nil )
private def mirror = {
if ( heading.isEmpty ) {
new Queue[T]( trailing.reverse, Nil )
} else this
}
def head = {
val q = mirror
if ( q.heading.isEmpty ) None else new Some(q.heading.head)
}
def tail = {
val q = mirror
if ( q.heading.isEmpty ) q else new Queue[T]( q.heading.tail, trailing )
}
def enqueue( a: T ) = {
new Queue[T]( heading, a::trailing )
}
}
メソッドエンキューで、new Queue( heading, a::trailing )
(タイプパラメータ[T]を省略して)記述した場合、コードはコンパイルされず、「オーバーロードされた定義へのあいまいな参照、両方のコンストラクタキューがタイプ(a:T *)キューのクラスキューになります。 [T]およびタイプのクラスキュー内のコンストラクターキュー(見出し:List [T]、末尾:List [T])Queue [T]は引数タイプ(List [T]、List [T])"と一致します。
では、なぜtypeパラメーターを明示的に指定する必要があるの[T]
でしょうか。そうしないと、Scalaは2つの別々のリストを全体として繰り返しパラメーターとして扱います。型推論と関係があると思いますが、誰か説明してもらえますか?