从Spark SQL中TreeNode的定义:
abstract class TreeNode[BaseType <: TreeNode[BaseType]] extends Product {
self: BaseType =>
...
}
对TreeNode
和BaseType
的子类型有什么看法?什么是可以接受的?
答案 0 :(得分:4)
首先,看看所谓的自我类型:Andrew Rollins的博客在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
本身。
此处的自我类型要求,如果TreeNode
的子类同时提供Product
,则class IntTreeNode extends TreeNode[Int] {}
的子类仅被“允许”。
Int
不会编译,因为:
TreeNode
不符合类[BaseType <: TreeNode[BaseType]]
的类型参数范围,即class IntTreeNode2 extends TreeNode[IntTreeNode2]
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
编译由于:
interface a {
public show();
}
interface b {
public show();
}
class name implements a,b {
private int var = 10;
public show() {
System.out.print(var);
}
}
上的