私がやろうとしていること (これは単純化された例ですが、必要なものはすべて含まれています)
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
}
}