我在查看 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]
(类型 A
是 Impl[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/