在初始化使用泛型的特征中的val时,是否可以访问Manifest?

时间:2012-06-08 21:19:18

标签: scala manifest implicit

我正在尝试做什么(这是一个简化的例子,但包含我需要的所有内容)

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
  }
}

1 个答案:

答案 0 :(得分:1)

您不能将trait的类型参数声明为具有Manifest上下文绑定,因为它等同于需要构造函数参数(特征不能具有)。我知道允许这个计划用于scala的未来版本。

此外,val不能有参数,因此根本无法实例化val依赖于我可以看到的Manifest[T]实例。但是你说你有这个工作:怎么样?