如何使用Scala Trait创建A类?

时间:2014-08-18 15:03:53

标签: class scala generics traits

Trait GenericLinkedList,案例类Cons和案例对象Nil的创建如下。 问题是我想使用这个genericLinkedList,但是正如你所知,当我们编写这段代码var list = new GenericLinkedList时,它不会导致Traits无法创建任何对象,对吧?我想创建一个扩展GenericLinkedList的类,但我不能。我该如何解决?

trait GenericLinkedList [+T] {
def prepend[TT >: T](x: TT): GenericLinkedList[TT] = this match {
    case _ => Cons(x,this) 
  }
}
case class Cons[+T](head: T,tail: GenericLinkedList[T]) extends GenericLinkedList[T]
case object Nil extends GenericLinkedList[Nothing]

1 个答案:

答案 0 :(得分:1)

你的问题似乎无法做到

val list = new GenericLinkedList

你的目标是创建一个空列表吗?

你可以做到

val list = new GenericLinkedList[Int] { }

因为特征不是抽象的,但它并不漂亮。您也可以为特征定义伴随对象

object GenericLinkedList {
  def apply[T](): GenericLinkedList[T] = Nil
}

并使用它以这种方式初始化一个空列表

scala> val x = GenericLinkedList[Int]()
// x: GenericLinkedList[Int] = Nil

scala> x.prepend(42)
// res0: GenericLinkedList[Int] = Cons(42,Nil)

顺便说一下,match实现中的通用prepend是无用的。你可以做到

 def prepend[TT >: T](x: TT): GenericLinkedList[TT] = Cons(x, this)