加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何在Spark的TreeNode中解释TreeNode类型限制和自我类

发布时间:2020-12-16 18:39:32 所属栏目:安全 来源:网络整理
导读:从Spark SQL中的 TreeNode定义: abstract class TreeNode[BaseType : TreeNode[BaseType]] extends Product { self: BaseType = ...} 它对TreeNode和BaseType的子类型有什么看法?什么是可以接受的? 解决方法 自我类型 首先,看看所谓的自我类型:安德鲁罗
从Spark SQL中的 TreeNode定义:

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

它对TreeNode和BaseType的子类型有什么看法?什么是可以接受的?

解决方法

自我类型

首先,看看所谓的自我类型:安德鲁罗林斯的博客在Self Type Annotations vs. Inheritance上有一个很好的介绍.

基本上,一种自我类型,写成

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

说,特性Foo只能混合在同样实现SomeType的类中.继承和自我类型之间的区别也很好地解释了here.

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

类型的限制

给定类型定义:

class TreeNode[BaseType <: TreeNode[BaseType]] {
  self: BaseType with Product =>
  // ...
}

>定义TreeNode [BaseType&lt ;: TreeNode [BaseType]]说:对TreeNode进行类型化,使得类型参数BaseType至少(在子类的意义上)也是TreeNode [BaseType].粗略地说,这意味着:type-parameter也必须是TreeNode本身.
>这里的自我类型要求,如果TreeNode的子类也提供了Product,则它只被“允许”.

具体例子

例1

class IntTreeNode extends TreeNode[Int] {}

由于以下原因无法编译:

>类型参数Int不符合类TreeNode的类型参数边界,即[BaseType&lt ;: TreeNode [BaseType]]
>由于自我限制而导致的非法继承.

例2

class IntTreeNode2 extends TreeNode[IntTreeNode2]

由于以下原因无法编译:

>由于自我限制而导致的非法继承.

例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 = ???
}

编译由于:

> BaseType和self-type的类型约束都得到了满足.所以,这就是原始定义所要求的.

备注

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读