在Scala中,您可以定义从其他参数中获取的参数,这些参数将第一个参数作为参数.例如在Lift中,你可以在Record和Mapper中找到这样的东西
MongoMetaRecord[BaseRecord <: MongoRecord[BaseRecord]]
Run Code Online (Sandbox Code Playgroud)
它意味着什么,这有用吗?
这是一个常用于让抽象类知道扩展它的实际具体类的类型的模式.有时知道最终的具体类型是有用的 - 例如,将它用作生成当前对象副本的方法的返回类型.
假设您想要这样做 - 让抽象类Abstract知道实现它的具体类型.您可以从定义类型参数开始,可能是这样的:
trait Abstract[A] {
def copyObject: A = ...
}
Run Code Online (Sandbox Code Playgroud)
但是你意识到实际上,它A应该是Abstract它自己的子类,因为你不希望子类提供随机参数化.所以你可以添加这个:
trait Abstract[A <: Abstract]
Run Code Online (Sandbox Code Playgroud)
...但你很快就会意识到它Abstract已经变成了泛型类型,所以你宁愿需要这个:
trait Abstract[A <: Abstract[A]]
Run Code Online (Sandbox Code Playgroud)
作为最后一步,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]
Run Code Online (Sandbox Code Playgroud)
这意味着应该对每个非叶子(抽象)类型进行参数化,并且只有最终的具体类才能删除类型参数.
| 归档时间: |
|
| 查看次数: |
176 次 |
| 最近记录: |