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]
的最小上限)。
我的 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]
的最小上限)。