5

我需要在我的伴生对象中定义一个 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];

问题是由于类型擦除,我无法获得泛型类型的类

4

1 回答 1

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
于 2013-06-13T11:15:32.147 回答