You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:05:00