0

私がやろうとしていること (これは単純化された例ですが、必要なものはすべて含まれています)

trait MyTrait[T] {

  val name = Somefunction(simpleName)

  def simpleName(implicit m:Manifest[T]) = m.erasure.getSimpleName

}

しかし、simpleName での val の初期化で「T のマニフェストがありません」というコンパイラ エラーが発生します。

やっている

val name = Somefunction(implicitly[Manifest[T]].erasure.getSimpleName)

同じことをします

Somefunction は作成するのにコストがかかるオブジェクトを返すので、一度だけ作成したいです。

これを機能させる唯一の方法は、オブジェクトが既に作成されているかどうかをチェックする関数を使用することです。作成されている場合はそれを返し、それ以外の場合は最初に作成してから返します。

編集 - 動作させる方法の例を追加

trait MyTrait[T] {
  var n:MyClass = null
  def name(implicit m:Manifest[T]) = {
    if(n == null) n = Somefunction(implicitly[Manifest[T]].erasure.getSimpleName)
    n
  }
}
4

1 に答える 1

1

traitの型パラメーターをコンテキストにバインドされているものとして宣言することはできませんManifest。これは、コンストラクターパラメーター(トレイトが持つことができない)を要求することと同等であるためです。これを許可することは、将来のバージョンのscalaで計画されていることを理解しています。

さらに、はパラメータを持つことができないので、私が見ることができるインスタンスに依存するvalものをインスタンス化することは単に不可能です。しかし、あなたはこれが機能するようになったと言っています:どうやって?valManifest[T]

于 2012-06-08T21:35:31.023 に答える