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
相关产品推荐
相关产品推荐

