2013-04-09 169 views
1

下面從這個問題Why cannot this.type be used for new instances有點。我想在構造函數中有一個this.type對象。我不相信這是可以做到的,但我希望這裏有人知道一個方法!
這是我的基地特質this.type作爲構造函數的參數

trait Node { 
    def parent:Option[this.type] 
} 

,我已經實現了一個類,如下所示

case class NodeInstance(parentValue:Option[NodeInstance]) extends Node { 
    def parent = parentValue.asInstanceOf[Option[this.type]] 
} 

,但我想有

case class NodeInstance(parent:Option[NodeInstance]) extends Node 

但是,這給出了一個壓倒一切的方法父具有不兼容的類型異常。

我想,我不能有此作爲繼承NodeInstance(如果它是一類說的)一個對象,會打破this.type要求。不過,我想,我會檢查,看看是否存在解決這個更好的辦法...

現在如果我用

trait Node[T] { self:T => 
    def parent:Option[T] 
} 

而且我希望有一個功能「根」,它返回根節點,如果我在嵌入式特質它

trait Node[T] { self:T => 
    def parent:Option[T] 
    def root:T = this.parent.map(_.root).getOrElse(this) 
} 

然後我得到的編譯器的異常值根本不是類型參數T的成員

如果我抽象出來的根,我再拿到類型參數問題S代表牛逼

object Node { 
    def root[T <: Node[?]](node:T):T = node.parent.map(root(_)).getOrElse(this) 
} 

OK,剛發現我可以有[T <:節點[T]

回答

3

this.type指實例類型。由於您在構造函數中,因此無法確定this.type。您將收到錯誤:this can be used only in a class, object, or template

在這種情況下,它是常見的引入類型參數和自我型

trait Node[T] { self:T => 
    def parent: Option[T] 
} 

case class NodeInstance(parent:Option[NodeInstance]) extends Node[NodeInstance] 
+1

值得一補充說,'當我們在談論相同的對象,'這this.type',才應使用'(例如,當在一個可鏈接的setter中返回'this'時),而不應該被用來表示「與'this'類型相同的其他對象。 – 2013-04-09 13:19:09

+0

在這種情況下說我創建一個函數 def getAncestors [T <:Node](node:T):List [T] 然後我有一個遞歸類型參數問題 – 2013-04-09 13:26:24

+0

@JPullar'def getAncestors [T < :Node [T]](node:T):List [T]'? – EECOLOR 2013-04-09 13:39:18