1

从这个问题开始,为什么不能 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

但这给出了一个覆盖方法 parent 具有不兼容的类型异常。

我想我不能把它作为继承 NodeInstance 的对象(如果它是一个类的话),会破坏 this.type 要求。但是我想我会检查一下是否有更好的方法来解决这个问题......

现在如果我使用

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

我想要一个返回根节点的函数'root',如果我将它嵌入到特征中

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

在这些情况下,通常会引入类型参数和 self 类型

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

case class NodeInstance(parent:Option[NodeInstance]) extends Node[NodeInstance]
于 2013-04-09T13:01:00.643 回答