Scala:获取伴生对象中的伴生类

标签 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];

问题是由于类型删除,我无法获取泛型类型的类

最佳答案

您的代码中有几个问题。首先,正如您已经说过的,类型将被删除,第二 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/

相关文章:

scala - Scala 中链式包子句背后的动机是什么?

scala - FSC 每次都重新编译

安卓/ Kotlin : Error: "Expecting a top level declaration > Task :app:buildInfoGeneratorDebug"

kotlin - 为什么我看不到扩展类的伴随对象组件?

scala - 无法访问伴随对象的字段

Scala Unix 时间戳

scala - Scala 或 Lift 工作的定位

Scala SBT 设置 dockerRepository "Repository for publishing is not specified"

scala - 在伴生对象的 apply 方法中使用 New 关键字

android - 伴随对象 - Android 是否希望将它们注册为 Activity (?)