链表中的协变类型T

时间:2019-03-09 08:16:03

标签: scala

我想根据本教程使用add方法创建一个单链接列表

Learning Scala by building Scala - Lists

您能解决错误吗?

Error:(6, 13) covariant type T occurs in contravariant position in type T of value element def add(element: T): MyLinkedList[T]

当我将+添加到泛型[T]时出现错误,因为没有+的方法应用不起作用。

sealed trait MyLinkedList[+T] {
    def add(element: T): MyLinkedList[T]
}

object MyLinkedList {
  def apply[T](elements: T*): MyLinkedList[T] = {
    if (elements.isEmpty) {
      new Empty[Nothing]
    } else {
      Cons(elements.head, apply(elements.tail: _*))
    }
  }

  final case class Cons[T](element: T, rest: MyLinkedList[T]) extends MyLinkedList[T] {
        override def add(element: T): MyLinkedList[T] = ???
  }

  final case class Empty[T]() extends MyLinkedList[T] {
        override def add(element: T): MyLinkedList[T] = ???
  }
}

1 个答案:

答案 0 :(得分:2)

如果更改add的签名,则错误消失:

sealed trait MyLinkedList[+T] {
  def add[U >: T](element: U): MyLinkedList[T]
}

如果您想保持MyLinkedList不变(没有+),则可以返回Empty[T]而不是Empty[Nothing]中的apply