Scala类型 - 为什么它们不一样?

时间:2015-10-05 11:08:25

标签: scala

type Some = (WarpableStats with WarpableCompanion[A]) forSome { type A <: Warpable }
type Of[A <: Warpable] = WarpableStats with WarpableCompanion[A]

为什么[_]与某些人不一样?

1 个答案:

答案 0 :(得分:5)

因为Of[_]不符合类型参数边界。您应该明确注释通配符。

implicitly[Of[_ <: Warpable] =:= Some]获得编译。

为什么呢?因为scala spec没有指定类型构造函数的约束,如果类型构造函数是存在类型,更准确地说是forSome的左侧部分。在你的情况下,它是Of。请注意,Of[_]是一个整体类型,而不是Of

您可以看到简化规则部分,该简化仅在TypeDecl部分,forSome的正确部分和类型构造函数的方差表示法上完成。

在您的情况下,conformance test是在存在类型Of[_]上完成的,而不是类型构造函数Of。根据规范,Of[_]等效形式Of[Any],因为Of[_]相当于Of[T] forSome {type T >: Nothing <: Any},而Of是不变的。所以它不符合Some。 (说equivalent form我的意思是skomelization。)

直观地说,当涉及到存在类型时,scala编译器不会检查你在类型构造函数中定义的约束。当使用存在类型时,你告诉scala:“会存在一些使forSome的左侧工作的类型,所以现在不要费心去检查左侧。”强>