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

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

此外, aval不能有参数,因此根本不可能实例化 aval依赖于Manifest[T]我可以看到的实例。但是你说过你有这个工作:如何?

于 2012-06-08T21:35:31.023 回答