Scala类型参数递归
在Scala中,您可以定义从另一个以第一个为参数的参数派生而来的参数。例如,在Lift中,您可以在Record和Mapper中找到此类内容Scala类型参数递归,scala,types,Scala,Types,在Scala中,您可以定义从另一个以第一个为参数的参数派生而来的参数。例如,在Lift中,您可以在Record和Mapper中找到此类内容 MongoMetaRecord[BaseRecord <: MongoRecord[BaseRecord]] MongoMetaRecord[BaseRecord这是一种模式,通常用于让抽象类知道扩展它的实际具体类的类型。有时了解最终具体类型是什么很有用,例如,将其用作生成当前对象副本的方法的返回类型 假设您想这样做-让抽象类abstract知道实现
MongoMetaRecord[BaseRecord <: MongoRecord[BaseRecord]]
MongoMetaRecord[BaseRecord这是一种模式,通常用于让抽象类知道扩展它的实际具体类的类型。有时了解最终具体类型是什么很有用,例如,将其用作生成当前对象副本的方法的返回类型
假设您想这样做-让抽象类abstract
知道实现它的具体类型
trait Abstract[A] {
def copyObject: A = ...
}
但随后您意识到,实际上,A
应该是Abstract
本身的子类,因为您不希望子类提供随机参数化。因此您可以添加以下内容:
trait Abstract[A <: Abstract]
作为最后一步,如果可以的话,您可能希望使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]
trait Abstract[+注同样的注释是可能的,并且实际上是用Java或C完成的。例如SortedStructure
,SortedStructure,其中T:i可比较
。
trait Abstract[+A <: Abstract[A]]
class Concrete1 extends Abstract[Concrete1]
trait RefinedAbstract[+A <: RefinedAbstract[A]] extends Abstract[A]
class Concrete2 extends RefinedAbstract[Concrete2]