【发布时间】:2020-05-02 07:59:15
【问题描述】:
我正在尝试为具有协变类型参数的类编写安全转换,例如:
case class Foo[+A](a: A) {
def safeCast[B <: A](): Option[B] = ???
}
它由动态外部数据源填充,但我至少想静态确保B 是A 的子类,如果类型转换失败则返回None。我不断收到关于 A 处于协变位置的错误。我可以通过省略<: A 对其进行类型检查,但是如何指定关于B 的静态保证?
我知道它可以防止将Foo[Dog] 分配给Foo[Animal] val 等情况,然后尝试执行safeCast[Mammal] 之类的操作,其中Mammal 不是Dog 的子类型。在我的情况下,这实际上没问题。即使允许转换为 Animal 的超类型也可以。我主要是想静态地阻止有人尝试safeCast[Plant]。
注意,我可以使用类外部的函数对其进行类型检查,如下所示,但我想要类上的方法。
def safeCast[A, B <: A](foo: Foo[A]): Option[B] = ???
作为奖励,如果您知道使用猫或不使用 isInstanceOf 的东西来实现此功能的方法,那将非常有用。
【问题讨论】:
-
麻烦的是,
Foo[A] <: Foo[Any]和B <: Any也是如此,所以无论A和B是什么,你的方法都将始终适用。
标签: scala generics casting covariance