案例类字段中的递归类型参数 [英] recursive type parameters in case class fields
本文介绍了案例类字段中的递归类型参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
好的,所以我知道我可以做类似的事情:
OK, so, I get that I can do things like:
trait MyTrait[T <: MyTrait[T]] { self: T =>
val listOfT: List[T]
def getFirst: T
def getOne: T = if (listOfT.length > 0) getFirst else self
}
class MyClass extends MyTrait[MyClass] {
override val listOfT: List[MyClass] = List[MyClass](this)
override def getFirst: MyClass = listOfT.head
}
如果我希望MyTrait有一个伴随对象,它看起来像:
and that if I want MyTrait to have a companion object it looks like:
object MyTrait{
def doSomething[T <: MyTrait[T]](aninstance:T)= { ... }
}
所有这些看起来很丑陋,我想看到一个更好的方法,但是,现在,我只是想弄清楚,如何从其他任何地方引用该类型?例如:
All that seems ugly and I'd like to see a nicer way, but, right now I'm just trying to figure out, how do I refer to the type from anywhere else? For example:
case class Foo( anInstanceOfMyTrait: MyTrait[what goes here???] )
还是有更简单的方法?
推荐答案
我可以使用它:
trait MyTrait[T <: MyTrait[T]] {
def getFirst = this
}
class MyClass extends MyTrait[MyClass]
case class Foo[A <: MyTrait[A]](i: MyTrait[A])
object MyTrait {
def doSomething[T <: MyTrait[T], U[X <: MyTrait[X]] <: MyTrait[X]](t: U[T]) =
t.getFirst
}
val mc = new MyClass
val foo = Foo(mc)
MyTrait.doSomething(foo.i)
这篇关于案例类字段中的递归类型参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文