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 


标签:Scala
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号