加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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的类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读