Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala-引用父类中的子类(泛型)_Scala_Generics - Fatal编程技术网

Scala-引用父类中的子类(泛型)

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

在泛型的情况下,我试图引用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 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谢谢你的帮助:)对:)我尽快改变答案:)