加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:20:12 所属栏目:安全 来源:网络整理
导读:我需要在我的伴侣对象中定义一个val,它用一个以伴侣类作为参数的方法初始化. 我想用特征处理这个问题,不要重复自己.我的问题是,X.getClass与classOf [X]不同.第一个是伴随对象的类,第二个是伴侣类的类,但我需要获取伴侣类而不直接对其进行硬编码. 基本上我需
我需要在我的伴侣对象中定义一个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];

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

解决方法

您的代码中存在几个问题.首先,正如您已经说过的,类型将被删除,第二个对象(对象FooCompanionObject [f<:Foo])不采用类型参数,第三,对象无法扩展(对象Bar扩展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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读