type Some = (WarpableStats with WarpableCompanion[A]) forSome { type A <: Warpable }
type Of[A <: Warpable] = WarpableStats with WarpableCompanion[A]
为什么[_]与某些人不一样?
答案 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
的左侧工作的类型,所以现在不要费心去检查左侧。”强>