1

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つの別々のリストを全体として繰り返しパラメーターとして扱います。型推論と関係があると思いますが、誰か説明してもらえますか?

4

2 に答える 2

2

型引数を指定しない場合、コンパイラはT(プライマリ コンストラクターの場合) またはList[T](補助コンストラクターの場合) のいずれかを推論できます。

于 2012-05-23T05:56:47.760 に答える