Scala类型别名会破坏类型兼容性
发布时间:2020-12-16 18:28:53 所属栏目:安全 来源:网络整理
导读:我一直认为,如果需要,类型别名总是扩展到原始类型.但是,这是一个麻烦制造者 def a[P](a: Option[P]) = { type Res = List[P] // result type alias Nil: Res // Replace this line with Nil: List[P] to clear the error}def b[V](v: V) = a(Some(v)): List[
我一直认为,如果需要,类型别名总是扩展到原始类型.但是,这是一个麻烦制造者
def a[P](a: Option[P]) = { type Res = List[P] // result type alias Nil: Res // Replace this line with Nil: List[P] to clear the error } def b[V](v: V) = a(Some(v)): List[V] 失败了(scastie) error: type mismatch; found : Res (which expands to) List[P] required: List[V] 你看到转换选项[P] =>列出[P],并且由于b提供了一些[V],因此转换选项[V] => b调用它时列出[V].但是,编译器说结果与List [V]不兼容.这怎么可能?如果用Nil替换Nil:Res,则错误消失(scastie):在a中列出[P].您需要消除类型别名以消除错误.这意味着类型别名是罪魁祸首. 解决方法
我几乎可以肯定这是一个编译错误. Scala中的类型别名应该自动展开,看起来在这种情况下a的类型被推断为[P](Option [P])=> Res,而不是[P](选项[P])=>列表[P].由于Res位于内部范围内,编译器无法找到它以正确推断b的类型.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |