【发布时间】:2017-06-05 22:07:45
【问题描述】:
我有以下代码,它应该采用函数A => Boolean(输入类型的泛型)并通过链式隐式转换将其转换为泛型特征Y[A]:
val f: Int => Boolean = ???
trait X[A] {
def m1: Unit
}
implicit def toX[A](f: A => Boolean): X[A] = ???
f.m1 // Works
trait Y[A] {
def m2: Unit
}
implicit def toY[T, A](x: T)(implicit toX: T => X[A]): Y[A] = ???
f.m2 // Won't compile
很遗憾,最后一行无法编译。
进行以下任何一个更改就足以使代码编译:
- 转向
X非泛型 - 转向
Y非泛型 - 将源类型(输入类型的泛型函数)替换为 输出 类型的泛型函数 (
Int => A) - 将源类型替换为其他泛型类型,例如
Option[A]、Seq[A]或Array[A]
基于此,我的结论是隐式转换链不起作用,因为源类型(输入类型上的泛型函数)是泛型和逆变以及中间类型和目标类型( X[A] 和 Y[A]) 是通用的。
关于如何解决这个问题的任何想法?
更新:最终代码缩进处理不仅是作为源类型的函数,还处理其他类型(Option[A]、Seq[A]、A 等)。为了实现这一点,我们的想法是拥有将这些类型中的每一个转换为X[A] 的toX 函数版本。那么只需要一个版本的toY。
【问题讨论】:
标签: scala generics implicit-conversion scala-implicits