上层类型绑定多态方法 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)
}
我正在尝试 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)
}