Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala类型参数递归_Scala_Types - Fatal编程技术网

Scala类型参数递归

Scala类型参数递归,scala,types,Scala,Types,在Scala中,您可以定义从另一个以第一个为参数的参数派生而来的参数。例如,在Lift中,您可以在Record和Mapper中找到此类内容 MongoMetaRecord[BaseRecord <: MongoRecord[BaseRecord]] MongoMetaRecord[BaseRecord这是一种模式,通常用于让抽象类知道扩展它的实际具体类的类型。有时了解最终具体类型是什么很有用,例如,将其用作生成当前对象副本的方法的返回类型 假设您想这样做-让抽象类abstract知道实现

在Scala中,您可以定义从另一个以第一个为参数的参数派生而来的参数。例如,在Lift中,您可以在Record和Mapper中找到此类内容

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]