Можно привести к неправильным типам без исключения в Scala
Я написал код на днях, чтобы отфильтровать поведение смешивания из списка.
Это пример кода, который должен описать проблему, с которой я столкнулся.
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 ответа
Просто предоставьте 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)
Тип ушел из-за стирания типа. Однако вы можете указать тип, попробуйте что-то вроде
def myFilter[A](toFilter : Any)(implicit classTag: ClassTag[A]) : Option[A] = toFilter match {
case keep : A => Some(keep)
case _ => None
}