【发布时间】:2020-12-04 21:43:04
【问题描述】:
所以我想创建一个模块,添加一个特征 Convertible,它是一个伴随对象,在初始化时对 Convertibles 列表做一些事情。
trait Convertible {
def toInt: Int
def toBoolean: Boolean
def toFloat: Float
}
object Convertible {
val objects = List(1, 2, "", 4, 44.4f, "Hello World!", 42)
def init(): Unit = {
for(obj <- objects) {
obj match {
case con: Convertible => ImportantStuff.doStuff(con.toInt, con.toBoolean, con.toFloat)
case _ =>
}
}
}
}
现在的问题是:我可以让其他人的模块从该模块之外的某些类型声明隐式声明吗?
假设另外 2 个不能更改文件“Convertible”但可以访问它的编码器实现了这样的事情:
object SomeGuysModule {
implicit class ConvertibleString(val string: String) extends Convertible {
def toInt = string.length
def toBoolean = string.isEmpty
def toFloat = string.length / 1024
}
}
object AnotherGuysModule {
implicit class ConvertibleInt(val int: Int) extends Convertible {
def toInt = int
def toBoolean = int != 0
def toFloat = int + int / 10F
}
}
有没有办法让初始模块在旅途中识别附加模块的隐式转换?
【问题讨论】:
-
你想要一个typeclass + magnet pattern。
-
你的前提有问题。
objects是List[Any]类型。它的所有元素都不会通过Convertible测试。
标签: scala implicit-conversion implicit