Scala模式匹配中为推断类型参数强制类型边界的问题
Scala编译错误:类型参数不满足上界约束
我尝试编译一段看似正确的Scala代码,但编译器拒绝通过,可能是操作有误或者需要添加类型提示。
原代码
sealed trait Foo[A] case class Bar[A, B <: A]() extends Foo[A] class Visitor[A](foo: Foo[A]) { def onBar[B <: A](bar: Bar[A, B]) = ??? def run = foo match case b: Bar[A, b] => onBar[b](b) }
报错信息
Type argument b does not conform to upper bound A
(中文翻译:类型参数b不符合上界约束A)
问题原因
模式匹配里的Bar[A, b]写法有误:这里的小写b被编译器当作新的类型参数名,而非从Bar实例中提取的已存在类型参数。编译器无法自动推断这个b满足b <: A的约束,因此抛出错误。
修复方案
使用Scala的类型模式绑定,让编译器正确推断类型参数的约束:
sealed trait Foo[A] case class Bar[A, B <: A]() extends Foo[A] class Visitor[A](foo: Foo[A]) { def onBar[B <: A](bar: Bar[A, B]) = ??? def run = foo match case b: Bar[A, B] => onBar[B](b) }
或者利用case class的构造器匹配,写法更清晰:
def run = foo match case b @ Bar[A, B]() => onBar[B](b)
这两种写法中,编译器会依据Bar类的定义(B <: A)自动确认类型参数B满足上界约束,从而通过编译。
内容的提问来源于stack exchange,提问作者Krever
相关产品推荐
相关产品推荐

