0

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

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

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)

也许我在做一些完全错误的事情,但它给我带来了很多问题,我现在必须创建很多代码,我希望通过这个函数使它们更具可读性。

4

2 回答 2

1

由于类型擦除,该类型消失了。但是,您可以提供类型,尝试类似

def myFilter[A](toFilter : Any)(implicit classTag: ClassTag[A]) : Option[A] = toFilter match {
  case keep : A => Some(keep)
  case _ => None
}
于 2016-04-04T15:15:58.820 回答
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)
于 2016-04-04T15:15:20.463 回答