在scala中可以毫无例外地转换为错误的类型

时间:2016-04-04 15:07:37

标签: scala erasure

我前几天编写了一个代码来过滤掉列表中的混合行为。

她是一个示例代码,应该描述我遇到的问题。

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)

也许我做的事情完全错了,但它在我身边造成了很多问题,我现在必须创建很多代码,我希望通过这个函数使其更具可读性。

2 个答案:

答案 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
}