我需要在我的伴生对象中定义一个 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];
问题是由于类型删除,我无法获取泛型类型的类
最佳答案
您的代码中有几个问题。首先,正如您已经说过的,类型将被删除,第二 object
s ( object FooCompanionObject[f <: Foo]
) 不接受类型参数,第三个 object
s 无法扩展 ( object Bar extends FooCompanionObject
)。为了做你想做的事,你必须为你的伴生对象创建一个抽象基类,它接受一个类型参数,如果你愿意,它可以被限制为特定类型,并且必须在 ClassTag
上绑定(bind)上下文。 。来自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
关于Scala:获取伴生对象中的伴生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17085219/