gpt4 book ai didi

class - 通过给定的泛型类型 Scala 获取类的伴随对象

转载 作者:行者123 更新时间:2023-12-03 10:15:06 27 4
gpt4 key购买 nike

我要做的是创建一个函数,该函数将采用泛型类并在其中使用静态方法(对不起,Java 语言,我的意思是它的伴随对象的方法)。

trait Worker {def doSth: Unit}

class Base

object Base extends Worker

// this actually wouldn't work, just to show what I'm trying to achieve
def callSthStatic[T that companion object is <: Worker](implicit m: Manifest[T]) {
// here I want to call T.doSth (on T object)
m.getMagicallyCompanionObject.doSth
}

有任何想法吗?

最佳答案

当我忘记如何执行此操作并且答案对我来说不是百分百满意时,我会一直点击此页面。以下是我如何处理反射:

val thisClassCompanion = m.reflect(this).symbol.companion.asModule
val structural = m.reflectModule(thisClassCompanion)
.instance.asInstanceOf[{def doSth: Unit}]

您可能需要验证该类是否确实有一个伴生对象或伴生对象。asModule 将抛出反射异常不是模块

更新:为清楚起见添加了另一个示例:
    object CompanionUtil {

import scala.reflect.runtime.{currentMirror => cm}

def companionOf[T, CT](implicit tag: TypeTag[T]): CT = {
Try[CT] {
val companionModule = tag.tpe.typeSymbol.companion.asModule
cm.reflectModule(companionModule).instance.asInstanceOf[CT]
}
}.getOrElse(throw new RuntimeException(s"Could not get companion object for type ${tag.tpe}"))

}

关于class - 通过给定的泛型类型 Scala 获取类的伴随对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9172775/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com