Scala-引用父类中的子类(泛型)
在泛型的情况下,我试图引用trait中的child类。这可能是不可能的,但如果有人知道这个问题的解决办法,我会很高兴。更多信息请参见下面的示例Scala-引用父类中的子类(泛型),scala,generics,Scala,Generics,在泛型的情况下,我试图引用trait中的child类。这可能是不可能的,但如果有人知道这个问题的解决办法,我会很高兴。更多信息请参见下面的示例 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
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-有界应用为:
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
}
}
objecttestmain{
trait A[Me您可能会更幸运地使用typeclass而不是继承。看看。您也可以尝试this.type
而不是原始定义中的A
或F-有界多态性。看看。一个小问题-第3行必须更改为:def doSomething(objects:Seq[Me]):A[Me谢谢你的帮助:)对:)我尽快改变答案:)