我正在尝试做什么(这是一个简化的例子,但包含我需要的所有内容)
trait MyTrait[T] {
val name = Somefunction(simpleName)
def simpleName(implicit m:Manifest[T]) = m.erasure.getSimpleName
}
但是我在simpleName上的val初始化时遇到了“No Manifest available for 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
}
}
答案 0 :(得分:1)
您不能将trait
的类型参数声明为具有Manifest
上下文绑定,因为它等同于需要构造函数参数(特征不能具有)。我知道允许这个计划用于scala的未来版本。
此外,val
不能有参数,因此根本无法实例化val
依赖于我可以看到的Manifest[T]
实例。但是你说你有这个工作:怎么样?