[英]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.