Я пытаюсь написать безопасное приведение для класса с ковариантным параметром типа, например:
case class Foo[+A](a: A) {
def safeCast[B <: A](): Option[B] = ???
}
Он заполняется динамическим c внешним источником данных, но я по крайней мере хочу Статически убедитесь, что B
является подклассом A
, а затем верните None
, если сбой при типизации. Я продолжаю получать сообщения о том, что A
находится в ковариантной позиции. Я могу получить его для проверки типов, отключив <: A
, но как я могу указать эту гарантию c о B
?
Я знаю, что это предотвращает ситуации, такие как присвоение Foo[Dog]
Foo[Animal]
val, затем пытается сделать что-то вроде safeCast[Mammal]
, где Mammal
не является подтипом Dog
. Это на самом деле нормально в моем случае. Даже если разрешить приведение к супертипу Animal
, все будет в порядке. В основном я хочу статически запретить кому-либо пытаться safeCast[Plant]
.
Обратите внимание, что я могу получить его для проверки типов с помощью функции, внешней по отношению к классу, как показано ниже, но мне нужен метод для класса.
def safeCast[A, B <: A](foo: Foo[A]): Option[B] = ???
В качестве бонуса, если вы знаете способ реализовать это, используя кошек или что-то без isInstanceOf
, это было бы очень полезно.