scala编译器中的Typer如何验证以下内容:
class D[T <: D[T]]
class E extends D[E]
D类型参数的上限D [T]必须与E兼容.E型不等于D,因此将检查其基本类型D.因为E的基类型和D的类型构造函数相等,所以必须检查边界。这是递归。 Core Calculus无法解决此问题。
答案 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
)