3

OK、次のようなことができることがわかりました。

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 を 2 回参照したことです。

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 に答える