Scala: 从ClassTag中获取类名

3

我正在编写一个通用方法,该方法可以将Any类型的参数转换为传递的ClassTag[T]类型的对象(如果可能)。

def getTypedArg[T: ClassTag](any: Any): Option[T] = {
      any match {
        case t: T => Some(t)
        case invalid =>
          logger.warn(s"Invalid argument: $invalid")
          None
      }
}

我希望日志信息可以更加精确,像这样:

case invalid => logger.warn(s"Invalid argument: $invalid of type $className")

我怎样从 ClassTag[T] 中检索出 className

或者,有没有一种根本不同的方法可以更好地满足我的用例?


我找到了这个相关问题,但不知道如何将其应用到我的示例中。 - y2k-shubham
1个回答

2

添加这个导入语句

import scala.reflect._

并将日志记录语句更改为:

logger.warn(s"Invalid argument: $invalid of type ${classTag[T].runtimeClass}")

这是从Scala classOf for type parameter中获取的。
这段代码涉及到类型参数和反射,主要目的是获取给定类型参数的类对象。在Scala中,我们可以使用classOf[T]来获取T的类对象。但是,如果我们有一个类型参数T,我们不能直接使用classOf[T],因为T在编译时是未知的。相反,我们可以使用Manifest来获取T的类对象。具体来说,我们可以使用implicitly[Manifest[T]]或implicitly[ClassTag[T]]来获取T的类对象。这两种方法都是使用隐式参数来传递Manifest或ClassTag的。

1
可以了;我进一步添加了 getSimpleName 来将带有包的 限定类名 com.company.package.A$A45$A$A45$MyClass 转换为 仅类名 MyClass,即 classTag[T].runtimeClass.getSimpleName - y2k-shubham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接