this.type作为构造函数参数

时间:2013-04-09 12:48:03

标签: scala generics types

稍后从这个问题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]
}

我想要一个函数'root',它返回根节点,如果我将它嵌入trait

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

然后我得到编译器异常值root不是Parameter T

类型的成员

如果我抽象出root,那么我会得到T

的类型参数问题
object Node {
  def root[T <: Node[?]](node:T):T = node.parent.map(root(_)).getOrElse(this)
}

好的,刚发现我可以[T&lt;:Node [T]]

1 个答案:

答案 0 :(得分: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]