我前几天编写了一个代码来过滤掉列表中的混合行为。
她是一个示例代码,应该描述我遇到的问题。
def myFilter[A](toFilter : Any) : Option[A] = toFilter match {
case keep : A => Some(keep)
case _ => None
}
// what happens
myFilter[Int]("hallo") // => Option[Int] = Some(hallo)
// what I expect
myFilter[Int]("hallo") // => Option[Int] = None
myFilter[Int](1) // => Option[Int] = Some(1)
也许我做的事情完全错了,但它在我身边造成了很多问题,我现在必须创建很多代码,我希望通过这个函数使其更具可读性。
答案 0 :(得分:1)
只需提供ClassTag
:
scala> import scala.reflect.ClassTag
import scala.reflect.ClassTag
scala> def myFilter[A: ClassTag](toFilter : Any) : Option[A] = toFilter match {
| case keep : A => Some(keep)
| case _ => None
| }
myFilter: [A](toFilter: Any)(implicit evidence$1: scala.reflect.ClassTag[A])Option[A]
scala> myFilter[Int]("hallo")
res2: Option[Int] = None
scala> myFilter[String]("hallo")
res3: Option[String] = Some(hallo)
答案 1 :(得分:1)
由于Type Erasure,类型消失了。但是,您可以提供类型,尝试类似
def myFilter[A](toFilter : Any)(implicit classTag: ClassTag[A]) : Option[A] = toFilter match {
case keep : A => Some(keep)
case _ => None
}