scala - 如何解释Spark的TreeNode中的TreeNode类型限制和自类型?

标签 scala apache-spark-sql treenode self-type

来自 TreeNode 的定义在 Spark SQL 中:

abstract class TreeNode[BaseType <: TreeNode[BaseType]] extends Product {
  self: BaseType =>
  ...
}

它对 TreeNodeBaseType 的子类型有何说明?什么是可以接受的?

最佳答案

self 类型

首先,看一下所谓的 self 类型:Andrew Rollins 的博客对 Self Type Annotations vs. Inheritance 做了很好的介绍。 .

基本上是一个 self 类型,写为

trait Foo { self: SomeType =>
  ...
}

说,特征 Foo只能混合在也实现 SomeType 的类中。继承和 self 类型之间的区别也得到了很好的解释here .

self 类型通常用于 Dependency Injection ,例如 Cake Pattern .

类型限制

给定类型定义:

class TreeNode[BaseType <: TreeNode[BaseType]] {
  self: BaseType with Product =>
  // ...
}
  1. 定义TreeNode[BaseType <: TreeNode[BaseType]]说: TreeNode 的类型为类型参数 BaseType至少(在子分类的意义上)也是 TreeNode[BaseType] 。粗略地说,这意味着:类型参数也必须是 TreeNode本身。

  2. 这里的 self 类型要求 TreeNode 的子类仅当它还提供 Product 时才“允许” 。

具体示例

示例 1

class IntTreeNode extends TreeNode[Int] {}

无法编译,原因是:

  1. 类型参数 Int不符合类 TreeNode的类型参数界限,即 [BaseType <: TreeNode[BaseType]]
  2. 由于自身类型限制而导致非法继承。

示例 2

class IntTreeNode2 extends TreeNode[IntTreeNode2]

无法编译,原因是:

  1. 由于自身类型限制而导致非法继承。

示例 3

class TupleTreeNode extends TreeNode[TupleTreeNode] with Product1[Int] {
  // implementation just to be a `Product1` 
  override def _1: Int = ???
  override def canEqual(that: Any): Boolean = ???
}

确实编译,因为:

  1. BaseType 上的类型约束 self 型都满足。所以,这就是原始定义所要求的。

备注

docs.scala-lang.org 上还给出了与您的示例(Catalyst)类似的示例。

关于scala - 如何解释Spark的TreeNode中的TreeNode类型限制和自类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33062753/

相关文章:

scala - 如何让 sbt-assembly 合并正确?

Scala:通过 if 语句更正表示类型的类型推断

scala - 在 Apache Spark 中,如何使 RDD/DataFrame 操作惰性化?

apache-spark - 如何读取所有以辅音开头的csv文件?

c++ - 在 B 树中存储键值对

scala - 如何从repl访问scala文档?

scala - 在 akka 中手动创建 Actor 层次结构

amazon-web-services - 在 Amazon EMR 4.0.0 上,设置/etc/spark/conf/spark-env.conf 无效

c# - .NET TreeView : Attach objects to TreeNodes

java - 在java中构建字符串的二叉搜索树