Можно привести к неправильным типам без исключения в 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
}
Другие вопросы по тегам