gpt4 book ai didi

Scala 类型参数重复

转载 作者:行者123 更新时间:2023-12-04 17:38:44 24 4
gpt4 key购买 nike

在 Scala 中,您可以定义从其他参数下降的参数,这些参数将第一个作为参数。例如在 Lift 中,您可以在 Record 和 Mapper 中找到此类内容

MongoMetaRecord[BaseRecord <: MongoRecord[BaseRecord]]

这是什么意思,这有什么用?

最佳答案

这是一种经常用于让抽象类知道扩展它的实际具体类的类型的模式。有时知道最终的具体类型是什么很有用——例如,将它用作生成当前对象副本的方法的返回类型。

假设你想这样做——让一个抽象类Abstract了解实现它的具体类型。您可以从定义一个类型参数开始,可能是这样的:

trait Abstract[A] {
def copyObject: A = ...
}

但后来你意识到,实际上, A应该是 Abstract 的子类本身,因为您不希望子类提供随机参数化。所以你可以添加这个:
trait Abstract[A <: Abstract]

... 但你很快就会意识到 Abstract也变成了泛型类型,所以你更需要这个:
trait Abstract[A <: Abstract[A]]

作为最后一步,您可能想要制作 A如果可以,协变,以便允许沿来自 Abstract 的继承路径的中间抽象类到最后的具体类:
trait Abstract[+A <: Abstract[A]]
class Concrete1 extends Abstract[Concrete1]

trait RefinedAbstract[+A <: RefinedAbstract[A]] extends Abstract[A]
class Concrete2 extends RefinedAbstract[Concrete2]

这意味着每个非叶(抽象)类型都应该被参数化,并且只有最终的具体类才能删除类型参数。

关于Scala 类型参数重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9680731/

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