Scala-使用复杂的泛型来获取子类和另一个类的信息-不';不编译?

Scala-使用复杂的泛型来获取子类和另一个类的信息-不';不编译?,scala,generics,inheritance,subclass,Scala,Generics,Inheritance,Subclass,我正在用scala编写一个程序,该程序使用以下框架: trait Tool[T <: Tool[T, U], U <: Settings[T]] { // members here def createSettingsFrom(settingsWithStringNames: Map[String, _]): U } trait Settings[T <: Tool[T, _ <: Settings[T]] 当我试图编译这些类时,我得到以下stacktrace

我正在用scala编写一个程序,该程序使用以下框架:

trait Tool[T <: Tool[T, U], U <: Settings[T]] {
  // members here
  def createSettingsFrom(settingsWithStringNames: Map[String, _]): U
}

trait Settings[T <: Tool[T, _ <: Settings[T]]
当我试图编译这些类时,我得到以下stacktrace:

信息:21/10/16 03:20-编译完成,在3s 200ms内出现2个错误和0个警告
/project_文件夹/src/main/scala/io/oreville/maptools/operations/cleanup/cleanup.scala

错误:(17,24)类型参数[package.tools.operations.cleanup.cleanup,package.tools.operations.cleanup.CleanupSettings]不符合trait ConfigurableTool的类型参数界限[T我无法重现您收到的错误消息

代码中有一些输入错误,但是在清除它们之后,剩下的唯一错误是
Cleanup
的定义,在扩展trait时不能将其作为类型参数传递

object Cleanup extends Tool[Cleanup.type, CleanupSettings] { ... }
涉及对象清理的非法循环引用

您可以通过将其作为一个特征,并在伴生对象中扩展它来解决此问题。以下是完整的代码:

trait Tool[T <: Tool[T, U], U <: Settings[T]] {
  // members here
  def createSettingsFrom(settingsWithStringNames: Map[String, _]): U
}

trait Settings[T <: Tool[T, _ <: Settings[T]]]

trait Cleanup extends Tool[Cleanup, CleanupSettings] {
  override def createSettingsFrom(settings: Map[String, _]): CleanupSettings = CleanupSettings(
    settings.get("attribute1").asInstanceOf[Int],
    settings.get("attribute2").asInstanceOf[String])
}
object Cleanup extends Cleanup

case class CleanupSettings(
  attribute1: Int,
  attribute2: String) extends Settings[Cleanup]

trait工具[T哦,那太酷了。我最终删除了subclass类型参数以简化它。我意识到引用Cleanup与引用它的类不同,但这是循环引用的一个很好的解决方法。谢谢:)
trait Tool[T <: Tool[T, U], U <: Settings[T]] {
  // members here
  def createSettingsFrom(settingsWithStringNames: Map[String, _]): U
}

trait Settings[T <: Tool[T, _ <: Settings[T]]]

trait Cleanup extends Tool[Cleanup, CleanupSettings] {
  override def createSettingsFrom(settings: Map[String, _]): CleanupSettings = CleanupSettings(
    settings.get("attribute1").asInstanceOf[Int],
    settings.get("attribute2").asInstanceOf[String])
}
object Cleanup extends Cleanup

case class CleanupSettings(
  attribute1: Int,
  attribute2: String) extends Settings[Cleanup]