【发布时间】:2012-03-08 14:44:35
【问题描述】:
这是我想做的简化示例。注释掉的行无法编译。
class Animal
object Animal { implicit def toElephant(a: Animal) = a.asInstanceOf[Elephant] }
class Elephant extends Animal
object Main {
def main(args: Array[String]) = {
val a: List[Animal] = List(new Elephant, new Elephant)
// val e: List[Elephant] = a
}
}
在正常情况下,e = a 当然是非法的。但是使用隐式函数,可以认为 scala 会自动转换列表中的每个元素。
有没有一种优雅的方式来获得这种行为?如果是,怎么做?
我想知道的是 scala 是否有一些模糊的角落可以强制执行我希望的行为。我对添加杂乱无章的解决方案不感兴趣。我自己能想到它们。例如,可以这样做:
object Animal {
implicit def toElephant(a: Animal) = a.asInstanceOf[Elephant]
implicit def toElephant(a: List[Animal]) = a.asInstanceOf[List[Elephant]] }
上面的代码就可以了。
【问题讨论】: