Scala类型别名破坏了类型兼容性

小外星人

我一直认为,如果需要,类型别名总是会扩展到其原始类型。但是,这是一个麻烦制造者

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]

您会看到进行a转换,Option[P] => List[P]并且由于b提供了Some[V],因此调用它也会进行a转换但是,编译器说结果与不兼容这怎么可能?如果您将替换错误就会消失(scastie您需要消除类型别名以消除该错误。这意味着类型别名是罪魁祸首。Option[V] => List[V]bList[V]Nil: ResNil: List[P]a

其他

我几乎可以肯定这是一个编译器错误。Scala中的类型别名应该会自动扩展,并且在这种情况下,其类型a推断为[P](Option[P]) => Res,而不是[P](Option[P]) => List[P]而且由于Res在内部范围内,因此编译器无法找到它来b正确推断类型

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章