为什么Manifest在构造函数中不可用?

时间:2011-09-03 17:39:50

标签: class scala types constructor manifest

考虑以下代码:

class Foo[T : Manifest](val id: String = manifest[T].erasure.getName)

我基本上想在Foo中存储一个标识符,它通常只是类名。

不需要特殊标识符的子类可以轻松使用默认值。

但是这甚至没有编译,错误信息是:

error: No Manifest available for T.

还有其他方法可行吗?

编辑:

如果清单在主构造函数之前不可用,为什么会这样?

class Foo[T: Manifest](val name: String) { 
  def this() = this(manifest[T].erasure.getName)
}

1 个答案:

答案 0 :(得分:10)

当从该上下文绑定中删除语法糖时,它将被重写为:

class Foo[T]
  (val id: String = implicitly[Manifest[T]].erasure.getName)
  (implicit ev$1: Manifest[T]) = ...

因此,在确定id的默认值时,清单证据根本不可用。我会写这样的东西:

class Foo[T : Manifest](id0: String = "") {
  val id = if (id0 != "") id0 else manifest[T].erasure.getName
}

在你的第二种方法中(顺便说一句,这是一个很好的解决方案!),期望重写类似于:

class Foo[T](val name: String)(implicit x$1: Manifest[T]) { 
  def this()(implicit ev$2: Manifest[T]) = this(manifest[T].erasure.getName)
}

是的,在调用manifest[T].erasure

之前,清单 可用