scala - Scala - 在父类中引用子类(泛型)
问题描述
在泛型的情况下,我试图在 trait 中引用子类。这可能是不可能的,但如果有人知道这个问题的解决方案,我会很高兴。更多信息在下面的示例中。
object TestMain {
trait A {
def doSomething(objects: Seq[A]): A // can I put something here instead of A to make it work?
}
case class B() extends A {
override def doSomething(objects: Seq[B]): B = {
objects.head
}
}
case class C() extends A {
override def doSomething(objects: Seq[C]): C = {
objects.head
}
}
def main(args: Array[String]): Unit = {
B().doSomething(Seq(B(), B())) //ok
C().doSomething(Seq(C(), C())) //ok
B().doSomething(Seq(B(), C())) //I want compile time error
}
}
我希望 A 和 B 类在编译时只接受它们自己的集合,而不是在每个类中进行检查。是否可以?
解决方案
正如@user 所述,您可以使用F 有界多态性来实现您想要的。
鉴于您的示例,我将 F-bounded 应用为:
object TestMain {
trait A[Me <: A[Me]]{
def doSomething(objects: Seq[Me]): A[Me] // can I put something here instead of A to make it work?
}
case class B() extends A[B] {
override def doSomething(objects: Seq[B]): B = {
objects.head
}
}
case class C() extends A[C] {
override def doSomething(objects: Seq[C]): C = {
objects.head
}
}
def main(args: Array[String]): Unit = {
B().doSomething(Seq(B(), B())) //ok
C().doSomething(Seq(C(), C())) //ok
B().doSomething(Seq(B(), C())) //now this thrown a compile time error
}
}
推荐阅读
- javascript - 用于不安全服务器的 Google Goelocation API
- python - 基于行索引从numpy数组列中选择元素
- java - 将枚举的每个数组值映射到枚举值
- c# - 检查字符是否为符号的意外结果
- c# - 使用 AddJwtBearer() 使用令牌 - 无法验证签名
- java - 如何在 VSTS 中触发 Java Selenium 测试后部署
- jquery - () 上的事件;复制 click() 事件;在 jQuery 中动态加载的元素
- r - 查找一行是否包含字符并创建一个新列来标记数据
- codeigniter - Codeigniter url 路由查询字符串
- javascript - html 绑定后不会触发 ngClick 事件