簡體   English   中英

類型構造函數的Scala繼承

[英]Scala Inheritance of Type Constructor

現在,我正在嘗試使用以下代碼實現鏈表的變體,但是我遇到了麻煩。 基本上,我正在嘗試創建不同類型的節點,這些節點將通過下一個方法相互連接。 因此,我有兩個類NodeA[T]NodeB[T] ,它們從抽象類NodeTrait[T]繼承。 接下來,我只想成為NodeTrait[T]的子類型並包含在Option任何類型。 因此,我接下來要Option[NodeA[T]]Option[NodeB[T]]

但是,我收到一個編譯器錯誤,提示類型Option[NodeTrait[T]]表達式未確認為期望的NodeTrait[T]類型。 我不確定如何解決這個問題。 我當時正在考慮使用協方差並將NodeTrait[T]更改為NodeTrait[+T]但仍然遇到更多編譯錯誤。 有人有解決此問題的提示嗎?

abstract class NodeTrait[T](x:T) {
  var next:Option[NodeTrait[T]]
  def insert(y: T):Option[NodeTrait[T]]
}



class NodeA[T](x:T) extends  NodeTrait[T](x){
  def insert(y: T): NodeTrait[T] = {
    val newnode = new NodeA[T](y)
    next = Some(new NodeA[T](y))
    next
  }
  next = None

}

class NodeB[T](x:T) extends  NodeTrait[T](x){
  def insert(y: T): NodeTrait[T] = {
    val newnode = new NodeB[T](y)
    next = Some(new NodeB[T](y))
    next
  }
  next = None



}

我不知道您的代碼做什么,讓我們假設它只是某些東西的簡化抽象版本,但是這里編輯的代碼可以編譯:

abstract class NodeTrait[T](x:T) {
  var next:Option[NodeTrait[T]]
  def insert(y: T):Option[NodeTrait[T]]
}


class NodeA[T](x:T) extends  NodeTrait[T](x){
  def insert(y: T): Option[NodeTrait[T]] = {
    val newnode = new NodeA[T](y)
    next = Some(new NodeA[T](y))
    next
  }
  var next: Option[NodeTrait[T]] = None

}

class NodeB[T](x:T) extends  NodeTrait[T](x){
  def insert(y: T): Option[NodeTrait[T]] = {
    val newnode = new NodeB[T](y)
    next = Some(new NodeB[T](y))
    next
  }

 var next: Option[NodeTrait[T]] = None
}

您在NodeB和NodeA insert方法中指定了不同的(不同於NodeTrait)返回類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM