3

好的,所以,我知道我可以做以下事情:

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???] )

或者有没有更简单的方法?

4

2 回答 2

3

查看您的评论,实际问题似乎是在您尝试参数化 Foo 时,您引用了 MyTrait 两次:

case class Foo[A <: MyTrait[A]](i:MyTrait[A])

试试这个:

case class Foo[A <: MyTrait[A]](i: A)

这反映了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
于 2012-09-07T18:54:53.367 回答
2

我得到了这个工作:

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)
于 2012-09-07T18:44:27.830 回答