为此:
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更加有效?
谢谢。
答案 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
作为类特征的输入,可以使用它。
答案 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)
}