通过 TypeTag 的 Scala 类名称简单地写为“TypeTagImpl”

问题描述 投票:0回答:1

有很多相关的问题,但到目前为止我还没有找到任何涵盖这个确切问题的问题。

我正在使用 TypeTag 尝试获取具有类型参数的类中的方法的类名称。

class ValidatePCollectionSize[T](implicit tt: TypeTag[T]) extends PTransform[PCollection[T], PCollection[T]] {

  private val className = tt.getClass.getSimpleName

  override def expand(input: PCollection[T]): PCollection[T] = {
    input
      .apply(s"CountElementsIn$className", Count.globally())
      .apply("ValidOrThrow", ParDo.of(new PCollectionSizeValidator(className)))

    input
  }
}

我这样称呼变换:

  val foo: PCollection[Foo] = {
    pipeline
      .apply(
        "ReadFooFromSource",
        // read transform, details elided
        SourceRead[Foo]
      )
      .apply("ValidateFooRead", new ValidatePCollectionSize[Foo])
  }

该方法的逻辑确实有效,但 val

className
被计算为字符串“TypeTagImpl”,而不是类型参数中类的实际名称。

有什么想法为什么它没有得到正确的名字吗?

scala reflection
1个回答
0
投票

tt.getClass
获得
Class[TypeTag[?]]
而不是
Class[T]

您可能想要

implicit ClassTag[A]
,然后
classTag[A].runtimeClass
(如果您想要
clazz.getSimpleName
)。

© www.soinside.com 2019 - 2024. All rights reserved.