我正在尝试做什么(这是一个简化的示例,但包含我需要的所有内容)
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
}
}