Scala:在伴侣对象中获取伴侣类

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)