我正在尝试实现一个Scala特性,它处理与需要我们创建的Java库连接的细节
我想做的是:
trait SomeTrait[A] extends JavaAPI {
def foo = {
callApi(classOf[A])
}
override def bar = {
foo
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,bar实际上覆盖了基类中的方法,因此我无法更改它的签名.
我已经尝试过使用Manifest等几种变体,但是不能完全实现这一点.有没有办法获取参数化类型的运行时类?
Kev*_*ght 10
这种味道应该做的伎俩:
trait SomeTrait[A] {
def foo(implicit ev: Manifest[A]) = {
callApi(ev.erasure)
}
}
Run Code Online (Sandbox Code Playgroud)
更新在某些时候,必须通过方法参数注入清单.如果特征可以拥有它们,那么构造函数将是一个不错的选择.
实际上,他们可以!该特征具有与其混合的任何构造函数,因此如果指定一个抽象清单,派生类必须定义...
trait SomeTrait {
def ev: Manifest[_] //abstract
def foo = println(ev.erasure)
}
//this `ev` provides the implementation, note that it MUST be a val, or var
class Concrete[T](implicit val ev: Manifest[T]) extends SomeTrait
Run Code Online (Sandbox Code Playgroud)
一切都很好.
你必须以某种方式获得清单,而traits没有构造函数参数.只有你可以说出你想做的权衡.这是另一个.
trait SomeTrait[A] {
implicit def manifesto: Manifest[A]
def foo = println(manifest[A].erasure)
}
object SomeTrait {
def apply[A: Manifest] : SomeTrait[A] = new SomeTrait[A] { def manifesto = manifest[A] }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3447 次 |
| 最近记录: |