soc*_*soc 7 constructor types scala class manifest
考虑以下代码:
class Foo[T : Manifest](val id: String = manifest[T].erasure.getName)
Run Code Online (Sandbox Code Playgroud)
我基本上想在Foo中存储一个标识符,它通常只是类名.
然后,不需要特殊标识符的子类可以轻松使用默认值.
但这甚至没有编译,错误信息是:
error: No Manifest available for T.
Run Code Online (Sandbox Code Playgroud)
还有其他方法可行吗?
编辑:
如果清单在主构造函数之前不可用,为什么这样做?
class Foo[T: Manifest](val name: String) {
def this() = this(manifest[T].erasure.getName)
}
Run Code Online (Sandbox Code Playgroud)
Kev*_*ght 10
当从该上下文绑定中删除语法糖时,它将被重写为:
class Foo[T]
(val id: String = implicitly[Manifest[T]].erasure.getName)
(implicit ev$1: Manifest[T]) = ...
Run Code Online (Sandbox Code Playgroud)
因此,在确定默认值时,清单证据根本不可用id
.我会写这样的东西:
class Foo[T : Manifest](id0: String = "") {
val id = if (id0 != "") id0 else manifest[T].erasure.getName
}
Run Code Online (Sandbox Code Playgroud)
在你的第二种方法中(顺便说一句,这是一个很好的解决方案!),期望重写类似于:
class Foo[T](val name: String)(implicit x$1: Manifest[T]) {
def this()(implicit ev$2: Manifest[T]) = this(manifest[T].erasure.getName)
}
Run Code Online (Sandbox Code Playgroud)
所以,是的,清单是可调用之前manifest[T].erasure
归档时间: |
|
查看次数: |
2825 次 |
最近记录: |