Scala Existential 类型奇怪的行为

Scala Existential type weird behavior

我的 REPL 中有以下内容:

scala> trait T[A]
defined trait T

scala> :kind T[A] forSome {type A}
T[_]'s kind is A

scala> :kind T[_]
T[_]'s kind is A

现在当我这样做时:

trait e[_] extends T[_]

我明白了

error: class type required but T[_] found

但是以下工作:

scala> trait e[_] extends T[Int]
defined trait e

scala> :kind T[Int]
T[Int]'s kind is A

为什么 T[Int] 与 T[_] 的处理方式不同,而它们属于同一种类?

这不是关于种类,而是关于一个类型是否是class类型(包括特征)。

你可以写

type T <: U

每种类型 U

trait T extends U

仅适用于 class 类型 U.

子类型和 inheritance/subclassing 不同。

一个trait T[A]对应的类型是每个A类型的class类型。所以 T[Int] 是 class 类型。 (当你写 extends A[B] 时,重要的是 A 是 class 类型,B 可以是任意类型。)

存在类型(如 T[_] 又名 T[A] forSome {type A})不是 class 类型。 (您也可以将 T[_] 视为所有 T[A] 的超类型。实际上,T[_] 是所有 T[A] 的最小上限)。