在Scala中:具有伴随对象特征的通用特征?

时间:2019-05-08 21:13:53

标签: scala functional-programming

为此:

trait TraitClass[A <: TraitObject] {
   def name = A.getName // <-- How ???
}

trait TraitObject[A <: TraitClass] {
   def apply: A
   def getName: String
}

case class Foo(a: Int) extends TraitClass[Foo] {

}

object Foo extends TraitObject[Foo] {
   def getName = "foo"
   def apply = Foo(12)
}

是否有一种方法可以使Scala更加有效?

谢谢。

2 个答案:

答案 0 :(得分:1)

我找到了解决方法:

abstract class TraitClass(obj: TraitObject[_]) {
   def name = obj.getName
}

trait TraitObject[A <: TraitClass] {
   def apply: A
   def getName: String
}

case class Foo(a: Int) extends TraitClass(Foo) {

}

object Foo extends TraitObject[Foo] {
   def getName = "foo"
   def apply = Foo(12)
}

通过传递Companion Object作为类特征的输入,可以使用它。

运行示例:https://scastie.scala-lang.org/D2GrOHIiQM6KcUMAYHjuuw

答案 1 :(得分:0)

这在很大程度上取决于您的用例。例如

  trait TraitClass[A <: TraitObject[_]] {
    def getA: A
    def name: String = getA.getName
  }

  trait TraitObject[A <: TraitClass[_]] {
    def apply: A
    def getName: String
  }

  case class Foo(a: Int) extends TraitClass[Foo.type] {
    def getA = Foo
  }

  object Foo extends TraitObject[Foo] {
    def getName = "foo"
    def apply = Foo(12)
  }