首页 > 解决方案 > Scala存在类型奇怪的行为

问题描述

我的 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[_] 的处理方式不同,而它们属于同一种类?

标签: scalaclassinheritancetypesexistential-type

解决方案


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

你可以写

type T <: U

对于每种类型U,但

trait T extends U

仅适用于类类型 U

子类型化和继承/子类化是不同的。

a 对应的trait T[A]类型是每个类型的类类型AT[Int]类类型也是如此。(当你写extends A[B]重要的A是类类型时,B可以是任意类型。)

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


推荐阅读