Scala:返回抽象方法的类型

时间:2016-09-13 13:03:30

标签: scala

如果具体类的相同方法具有不同的return(sub)类型,我无法弄清楚如何指定抽象类A的方法的返回类型:

abstract class A {
    def method: List[Common (?)]   // I want to force all subclasses to define this method
}

class B1 extends A {
    def method(a,b,c): List[Sub1] = {...}
}

class B2 extends A {
    def method(a,b,c): List[Sub2] = {...}
}

我尝试定义Sub1Sub2的共同特征:

abstract class Common   // or abstract class
case class Sub1 extends Common
case class Sub2 extends Common

但我一直得到这个:

Compilation error[class B1 needs to be abstract, 
since method "method" in class A of type => List[Common] is not defined]

如果我没有在A类中定义返回类型,我会使用... type => Unit ...获得相同的错误。

我该如何解决?

2 个答案:

答案 0 :(得分:5)

 // returns `List[Common]` to simplify things, but it would be the same if we returned a sub-type
 def method(a: ?, b: ?, c: ?): List[Common] = {...}

不一样
List[Common]

第一个是无参数方法,返回List[Common],第二个是三个参数返回def method: List[Common]的方法。编译器将这些视为两种完全不同的方法。它们具有相同名称的事实毫无意义。

编译器抱怨,因为A的子类中未定义{{1}}。

答案 1 :(得分:1)

编译:

  abstract class Common   // or abstract class
  case class Sub1() extends Common
  case class Sub2() extends Common

  abstract class A {
    def method(): List[Common]
  }

  class B1 extends A {
    def method(): List[Sub1] = ???
  }

  class B2 extends A {
    def method(): List[Sub2] = ???
  }

我所做的就是:

  • ()添加到Sub1()Sub2()
  • List[Common]
  • 返回A

修改

正如@ m-z所提到的,它起作用,因为现在每个def method()都有相同的签名。