Scala中类型边界自引用的含义解析:以Spark TreeNode代码为例
解析Scala中
TreeNode[BaseType <: TreeNode[BaseType]]的类型边界 先看这段代码:
abstract class TreeNode[BaseType <: TreeNode[BaseType]] extends Product with TreePatternBits {
这种写法叫F-bounded多态,说白了就是给泛型BaseType加了个「自我约束」:你要继承TreeNode,就得把你自己当成泛型参数传进来。
举个实际例子:如果要写TreeNode的子类,必须写成这样:
class MyTreeNode extends TreeNode[MyTreeNode]
不能乱传别的类型,比如class BadNode extends TreeNode[String]或者直接class BadNode extends TreeNode,编译器会直接报错。
这么做的核心好处是让父类的方法能精准返回子类类型。比如TreeNode里如果有个修改节点的方法,返回值类型会是BaseType(也就是具体的子类),而不是模糊的TreeNode类型,调用方不用做类型强转,代码更安全也更顺手。
内容的提问来源于stack exchange,提问作者obeattie
相关产品推荐
相关产品推荐

