1

this question Why cannot this.type be used for new instancesからいくらか続いています。コンストラクターに 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)
}

次に、コンパイラの例外値 root is not a member of type Parameter T を取得します

ルートを抽象化すると、T の型パラメーターの問題が発生します

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

[T <: Node[T]] を持つことができることを発見しました

4

1 に答える 1

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]
于 2013-04-09T13:01:00.643 に答える