【问题标题】:Scala: Return type of abstract methodScala:抽象方法的返回类型
【发布时间】:2016-09-13 13:03:29
【问题描述】:

如果具体类的相同方法具有不同的返回(子)类型,我无法弄清楚如何指定抽象类 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] = {...}
}

我试图定义Sub1 和Sub2 的共同特征:

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 ... 相同的错误。

我该如何解决?

【问题讨论】:

  • 我在这个问题中没有看到 Java。
  • 好的,我删除了标签。我认为这是一个关于继承的抽象问题。
  • 不,它是 Scala 的类型系统特有的。
  • @MarkoTopolnik 不,不是。这是一个继承问题。
  • @m-z 这要么是关于一般继承的完全抽象问题,要么是关于一种语言类型系统的特定问题。这绝对不是 Scala 和 Java 特有的问题。

标签: scala


【解决方案1】:
 def method: List[Common]

和

不一样
 // 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 的子类中定义。

【讨论】:

  • 感谢您的解释。
【解决方案2】:

这样编译:

  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()
  • 从A返回List[Common]

编辑

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

【讨论】:

    猜你喜欢
    • 2013-04-16
    • 2010-12-13
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多