上层类型绑定多态方法 Scala

Upper Type bound Polymorphic method Scala

我正在尝试 Scala 中的一些通用函数,但我似乎无法让以下示例正常工作:

我遇到了以下(简化的)问题。我有一个 parent 配置(这是一个特征)和两个继承自此 parent 配置的 case classes。他们都添加了一个额外的参数。然后我进一步得到了另一个Parent特征和2个扩展这个特征的子classes。这些 subclasses 都实现了 parents 方法,它应该同时具有获取配置和打印配置的功能。在我的主要 class 然后我 运行 一个 运行ner 函数应该首先获取配置,然后打印配置。

我尝试过的是:更改 parent 和 children 中的边界。我还尝试更改 return 类型。但是,这似乎不起作用。


trait ParentConfig{val input : String}

case class ConfigOne(input:String, extraArg:String) extends ParentConfig

case class ConfigTwo(input:String, extraTwo:String) extends ParentConfig

trait inheritanceTester {

  def getConfig[A >: ParentConfig](): A

  def printConfig[A <: ParentConfig](conf: A): Unit
}


class ExtensionOne extends inheritanceTester {
 def getConfig[A >: ConfigOne](): A = {
   ConfigOne("test1","testOne")
 }

  def printConfig[A <: ConfigOne](conf:A): Unit  = {
    println(conf.extraArg)
  }
}

class ExtensionTwo extends inheritanceTester {
  def getConfig[A >: ConfigTwo](): A = {
    ConfigTwo("test2","testTwo")
  }

  override def printConfig[A <: ConfigTwo](conf:A): Unit  = {
    println(conf.extraTwo)
  }
}
object Main extends App {

  def run[A <: inheritanceTester](input: A): Unit = {
    val conf = input.getConfig()
    input.printConfig(conf)
  }

  val extensionOne = new ExtensionOne()
  run(extensionOne)

  val extensionTwo = new ExtensionTwo()
  run(extensionTwo)
}


此时我在编译时收到以下错误消息:

错误:(26, 7) 在类型 [A <: collections.ParentConfig](conf: A)Unit 的特征继承测试器中覆盖方法 printConfig; 方法 printConfig 具有不兼容的类型

错误:(36, 16) 在类型 [A <: collections.ParentConfig](conf: A)Unit 的 trait inheritanceTester 中覆盖方法 printConfig; 方法 printConfig 具有不兼容的类型

这可能只是一个很容易解决的愚蠢问题。但我有点卡住了。谁能指出我在哪里看的正确方向?我可能使用这些边界是错误的,还是这不是多态函数的直接用例?

是这样的吗?

trait ParentConfig{val input : String}

case class ConfigOne(input:String, extraArg:String) extends ParentConfig

case class ConfigTwo(input:String, extraTwo:String) extends ParentConfig
trait InheritanceTester[A <: ParentConfig] {

  def getConfig(): A

  def printConfig(conf: A): Unit
}


class ExtensionOne extends InheritanceTester[ConfigOne] {
  override def getConfig(): ConfigOne = {
   ConfigOne("test1","testOne")
  }

  override def printConfig(conf: ConfigOne): Unit  = {
    println(conf.extraArg)
  }
}

class ExtensionTwo extends InheritanceTester[ConfigTwo] {
  override def getConfig(): ConfigTwo = {
    ConfigTwo("test2","testTwo")
  }

  override def printConfig(conf: ConfigTwo): Unit  = {
    println(conf.extraTwo)
  }
}
object Main extends App {

  def run[A <: ParentConfig](input: InheritanceTester[A]): Unit = {
    val conf = input.getConfig()
    input.printConfig(conf)
  }

  val extensionOne = new ExtensionOne()
  run(extensionOne)

  val extensionTwo = new ExtensionTwo()
  run(extensionTwo)
}