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

Scala如何为满足类型参数约束的Foo添加带调用校验的内置bar方法

问题分析与解决方案

错误原因

你当前的实现错误在于给类型参数C额外添加了C <: A的上界约束:
该约束要求C必须是A的子类,同时你又要求A <:< C的隐式证据,两者同时满足的唯一可能是C与A完全相等,完全不符合你原隐式类的推导逻辑(需要找A和Bar的类型参数的公共超类型)。

修正后的实现

直接去掉C的上界约束即可,代码如下:

trait Foo[+A, +B] {
    def bar[C](implicit evA: A <:< C, evB: B <:< Bar[C]): C = ???
}

效果验证

修正后的实现和原隐式类行为完全一致:

  • foo2.bar:编译器会推断C为Apple,返回类型为Apple,符合预期
  • foo0.bar:编译器会推断C为Apple和Banana的公共超类型Fruit,返回类型为Fruit,符合预期
  • foo1.bar:编译器会推断C为Apple和String的公共超类型Object,返回类型为Object,符合预期
  • foo3.bar:无法找到List[Apple] <:< Bar[C]的隐式证据,编译报错,满足「仅满足类型约束时可调用」的要求

内容的提问来源于stack exchange,提问作者tusharmath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:06:03