scala – 如何在Spark的TreeNode中解释TreeNode类型限制和自我类
从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< ;: TreeNode [BaseType]]说:对TreeNode进行类型化,使得类型参数BaseType至少(在子类的意义上)也是TreeNode [BaseType].粗略地说,这意味着:type-parameter也必须是TreeNode本身. 具体例子 例1 class IntTreeNode extends TreeNode[Int] {} 由于以下原因无法编译: >类型参数Int不符合类TreeNode的类型参数边界,即[BaseType< ;: 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)类似的示例 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |