有很多相关的问题,但到目前为止我还没有找到任何涵盖这个确切问题的问题。
我正在使用 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”,而不是类型参数中类的实际名称。
有什么想法为什么它没有得到正确的名字吗?
tt.getClass
获得 Class[TypeTag[?]]
而不是 Class[T]
。
您可能想要
implicit ClassTag[A]
,然后 classTag[A].runtimeClass
(如果您想要 clazz.getSimpleName
)。