作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在泛型的情况下,我试图在 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-bounded polymorphism实现你想要的。
鉴于您的示例,我将 F 有界应用为:
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
}
}
我希望我能帮助你:)
关于Scala - 在父类中引用子类(泛型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67577559/
我是一名优秀的程序员,十分优秀!