Scala在List confusion中重复了参数和参数

时间:2012-05-23 05:36:22

标签: scala

我正在使用Scala 2.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]),代码将不会编译和scalac抱怨“模糊引用重载定义,两个构造函数Queue在类Queue中type(a:T *)Queue [T]和构造函数Queue在类Queue中的类型(heading:List [T],trailing:List [T])Queue [T]匹配参数类型(List [T],List [T ])”。

那么为什么有必要明确指定类型参数[T]否则Scala会将两个单独的列表视为重复参数的整体?我认为它与类型推断有关,有人可以解释一下吗?

2 个答案:

答案 0 :(得分:2)

如果不提供type参数,编译器可以推断T(对于主构造函数)或List[T](对于辅助构造函数)。

答案 1 :(得分:2)

Heiko的回答是正确的,但为了澄清这一点,T中的enqueueTQueue的{​​{1}}不同class Queue[T] private( private val heading: List[T], private val trailing: List[T]) { /* ... */} object Queue { def apply[T](xs: T*) = new Queue(xs.toList, Nil) } 即将创造并因此被推断导致模糊性。为什么你还有2个构造函数?我建议你使用一个伴侣作为外部世界的构造函数:

{{1}}