mak*_*enz 5 scala companion-object
我需要在我的伴侣对象中定义一个val,它用一个以伴侣类作为参数的方法初始化.
我想用特征处理这个问题,不要重复自己.我的问题是,X.getClass与classOf [X]不同.首先是类的同伴对象,第二个是班里的同伴类的,但我需要得到同伴类,而不直接硬编码.
基本上我需要这样的东西:
trait Foo {
}
object FooCompanionObject[f <: Foo] {
val fClazz = classOf[f]
}
// Bar's fClass should be classOf[Bar]
case class Bar extends Foo;
object Bar extends FooCompanionObject[Bar];
Run Code Online (Sandbox Code Playgroud)
问题是由于类型擦除,我无法获得泛型类
dre*_*xin 11
您的代码中存在几个问题.首先,正如您已经说过的,类型将被删除,第二个objects(object FooCompanionObject[f <: Foo])不采用类型参数,第三个,objects不能被扩展(object Bar extends FooCompanionObject).要做你想做的事,你必须为你的伴侣对象创建一个抽象基类,它接受一个类型参数,如果你愿意,它可以被约束到一个特定的类型,并且必须是上下文绑定的ClassTag.ClassTag然后,您可以通过调用runtimeClass它来获取运行时类.最终解决方案可能如下所示:
import scala.reflect.ClassTag
import scala.reflect.classTag
trait Foo
abstract class Companion[A <: Foo : ClassTag] {
val fClazz = classTag[A].runtimeClass
}
class Bar extends Foo
object Bar extends Companion[Bar]
scala> Bar.fClazz
res2: Class[_] = class Bar
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3078 次 |
| 最近记录: |