【发布时间】:2021-10-27 02:32:42
【问题描述】:
我有一些基本上可以归结为这个的 scala 2.13 代码
import scala.language.implicitConversions
trait Base {
type V
def v: V
}
case class Derived(v: Int) extends Base {
type V = Int
}
object TestImplicitConversion {
implicit def getV[T <: Base](a: T): T#V = a.v
val a: Int = Derived(5)
}
这里我希望编译器使用隐式转换getV 将Derived 转换为Int,但是代码无法编译。手动添加对getV 的调用将使代码编译。有人可以帮我理解为什么在标准中解释了转换。
我发现进行这种转换的方法是添加第二个通用参数和一个约束
implicit def getV2[T <: Base, S](a: T)(implicit constraint: T#V =:= S): S = constraint(a.v)
在这个版本中,编译器使用转换并且代码会编译。
编辑:
@user 使用细化类型提供的替代解决方案确实看起来是一种更好的方法。但它并没有真正提供为什么它的原始实现不起作用的答案。所以我仍然有兴趣了解为什么编译器在显式调用将使代码编译时不使用隐式 def。
【问题讨论】:
-
@gianlucaaguzzi 将类型投影
T#V替换为路径相关类型a.V没有帮助。斯卡拉 2.13.6。 -
@DmytroMitin 对我来说似乎是work。
-
@user 你删除了
implicit。当然,通过显式调用它可以工作。 -
@user 如果删除
implicit,则无需将类型投影替换为路径相关类型。显式调用甚至可以使用类型投影。
标签: scala implicit-conversion implicit type-projection