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

tim*_*tim 6 scala

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

class D[T <: D[T]]
class E extends D[E]
Run Code Online (Sandbox Code Playgroud)

D类型参数的上限D [T]必须与E兼容.E型不等于D,因此将检查其基本类型D. 因为E的基类型和D的类型构造函数相等,所以必须检查边界.这是递归.该核心微积分不处理这种情况.

Jam*_*Iry 4

1)开始于

E extends D[E]
Run Code Online (Sandbox Code Playgroud)

2)Extends意味着Scala中的子类型化,所以

E <: D[E]        
Run Code Online (Sandbox Code Playgroud)

3) 由于“类D[T <: D[T]]”的定义,任何D[T]对T的要求是T <: D[T]。步骤 2 表示 E 必须能够插入 T,因此它更好地符合该要求。将 E 替换为 T,我们得到以下要求:

E <: D[E]
Run Code Online (Sandbox Code Playgroud)

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