在 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/