1

我正在使用 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 抱怨“对重载定义的模糊引用,类型为 (a: T*)Queue 的类 Queue 中的构造函数 Queue [T] 和类 Queue 中的构造函数 Queue 类型(标题:List[T],尾随:List[T])Queue[T] 匹配参数类型(List[T],List[T])”。

那么为什么需要显式指定类型参数,[T]否则 Scala 会将两个单独的列表作为一个整体来处理重复参数?我认为这与类型推断有关,有人可以解释一下吗?

4

2 回答 2

2

Heiko 的回答是正确的,但为了澄清这一点,Tin与您将要创建的上下文中的enqueue不同,因此必须推断这会导致歧义。为什么你有 2 个构造函数呢?我建议您为外部世界的构造函数使用伴侣:TQueue

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)
}
于 2012-05-23T07:17:52.887 回答
2

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

于 2012-05-23T05:56:47.760 回答