【发布时间】:2012-03-10 09:45:57
【问题描述】:
我有一个代码试图将一个函数包装在另一个执行动态类型检查的函数中:
class Base
class Foo extends Base
class Bar extends Base
object Main{
def checker[A <: Base]( func : A => String) : Base => String =
(b : Base) => b match {
case a : A => func(a)
case _ => "error"
}
def fooFunc(f : Foo) = "It's a foo"
def main(arg : Array[String]) {
val check = checker(fooFunc)
println(check(new Foo) + ", " + check(new Bar))
}
}
这会产生以下错误:
Exception in thread "main" java.lang.ClassCastException: Bar cannot be cast to Foo
at Main$$anonfun$1.apply(Main.scala:17)
at Main$.main(Main.scala:19)
at Main.main(Main.scala)
如果我在 checker 的定义中删除类型参数并将 A 替换为 Foo ,则效果很好。但是,如果我保留类型参数但省略函数参数并将 func(a) 替换为“good”,我会得到 Foo 和 Bar 的“good”。
这就是所谓的类型擦除吗?我对这个概念不太熟悉..
另外,我很想听听有关此问题的解决方案。
【问题讨论】: