gpt4 book ai didi

scala - 在 Scala 中绑定(bind)引用自身的类型是什么意思?

转载 作者:行者123 更新时间:2023-12-05 08:35:43 24 4
gpt4 key购买 nike

我在查看 GitHub 上的一些代码时发现了这个类型声明:

abstract class TreeNode[BaseType <: TreeNode[BaseType]] extends Product with TreePatternBits {

(这是 from the Spark source code ,尽管这个问题实际上不是关于 Spark 而是关于 Scala 的类型系统。)

这对我来说是新的。用简单的英语来说,这个类型绑定(bind)是什么意思?

最佳答案

几乎没有人阅读有关系统 F 的白皮书(在评论中提到),人们仍在直观地使用 F 绑定(bind)类型多态性。

您只需要了解类/特征 MyType[A <: MyType[A]]强制您将其扩展为 class Impl extends MyType[Impl] ,即作为类型参数传递自身。

trait Interface[A <: Interface[A]] {

def getValue: String

def setValue(value: String): A
}

如果你想做这样的事情,这很有用:

class Impl(value: String) extends Interface[Impl] {

override def getValue: String = value

override def setValue(value: String): Impl = new Impl(value)
}

没有这个A <: Interface[A] (类型 AImpl[A] 的子类型/扩展)有人可以实现:

// no F-bound type polymorphism
trait Interface[A] {

def getValue: String

def setValue(value: String): A
}

class Foo

class Impl extends Inteface[Foo] {

override def getValue: String = value

// we wanted to force implementation to have Impl here but now we cannot
override def setValue(value: String): Foo = new Foo
}

如果您有接口(interface),例如对一些代数建模,例如:

trait Number[A <: Number[A]] {

def add(a: A): A
}

使实现具有与其自身类型相同的方法输入/输出:

class Integer(val i: Int) extends Number[Integer] {

def add(a: Integer): Integer = new Integer(i + a.i)
}

它在 OOP 中更受欢迎,因为 FP 提供了使用类型类的替代方法。

关于scala - 在 Scala 中绑定(bind)引用自身的类型是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73442445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com