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

时间:2016-06-26 18:48:11

标签: scala type-alias

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

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会在Option[V] => List[V]来电时转换b它。但是,编译器说结果与List[V]不兼容。这怎么可能?如果您将Nil: Res替换为Nil: List[P]中的a,则错误消失(scastie)。您需要消除类型别名以消除错误。这意味着类型别名是罪魁祸首。

1 个答案:

答案 0 :(得分:0)

我几乎可以肯定这是一个编译错误。 Scala中的类型别名应该自动展开,看起来在这种情况下,graph_draw(g, pos=position) 的类型被推断为a,而不是[P](Option[P]) => Res。由于Res位于内部范围内,编译器无法找到它以正确推断[P](Option[P]) => List[P]的类型。