scala之案例类字段中的递归类型参数
mq0036
阅读:13
2024-11-01 17:39:52
评论:0
好的,所以,我知道我可以做如下事情:
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 有一个伴随对象,它看起来像:
object MyTrait{
def doSomething[T <: MyTrait[T]](aninstance:T)= { ... }
}
所有这些看起来都很丑陋,我希望看到一个更好的方法,但是,现在我只是想弄清楚,我如何从其他地方引用该类型?例如:
case class Foo( anInstanceOfMyTrait: MyTrait[what goes here???] )
或者有更简单的方法吗?
请您参考如下方法:
从您的评论来看,实际问题似乎是在您尝试参数化 Foo 时,您引用了 MyTrait 两次:
case class Foo[A <: MyTrait[A]](i:MyTrait[A])
试试这个:
case class Foo[A <: MyTrait[A]](i: A)
这反射(reflect)了 MyTrait.doSomething
的定义方式,因此您可以将 i 传递给 doSomething:
case class Foo[A<:MyTrait[A]](i: A)
val foo = new Foo[MyClass]( new MyClass )
MyTrait.doSomething( foo.i ) // This compiled OK
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。