链表中的协变类型T

3

我想根据教程创建一个带有“add”方法的单向链表。

通过构建Scala-Lists学习Scala

您能否解决错误?

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个回答

2

如果您更改add的签名,该错误将消失:

最初的回答翻译成中文为"原始答案"。

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

如果你想保持不变(没有+),在apply中可以返回Empty[T]而不是Empty[Nothing]。最初的回答。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接