scala类型系统中的核心演算(递归)

时间:2011-02-20 15:46:59

标签: scala

scala编译器中的Typer如何验证以下内容:

class D[T <: D[T]]
class E extends D[E]

D类型参数的上限D [T]必须与E兼容.E型不等于D,因此将检查其基本类型D.因为E的基类型和D的类型构造函数相等,所以必须检查边界。这是递归。 Core Calculus无法解决此问题。

2 个答案:

答案 0 :(得分:4)

1)从

开始
E extends D[E]

2)扩展意味着Scala中的子类型,所以

E <: D[E]        

3)由于定义“D类[T&lt;:D [T]]”,对任何D [T]的T的要求是T&lt;:D [T]。第2步说E必须能够插入T,所以它更符合这个要求。用E代替T我们得到

的要求
E <: D[E]

我们已经在步骤2中显示了E&lt;:D [E]。我们已经完成了。

答案 1 :(得分:3)

没有真正的答案,只有两个评论:这种模式称为CRTP,它也适用于Java(参见java.lang.Enum