访问case类属性时的Scala反射问题

yftpprvb  于 2023-02-04  发布在  Scala
关注(0)|答案(2)|浏览(130)

我已经能够使用scala和Reflection来获得case类的属性列表。

import scala.reflect.runtime.universe._

def classAccessors[T: TypeTag]: List[MethodSymbol] = typeOf[T].members.collect {
  case m: MethodSymbol if m.isCaseAccessor => m 
}.toList

case class Z(a1: String, b1: String, id: Integer)
val z = classAccessors[Z]

val res1 = z.map(x => if(x.equals("value id")) "xxx" else x)

然而,.equals不工作,但没有给出错误-〉所以我错过了一些东西,我不能谷歌它。必须是一些基本的。
.replace不起作用,那会怎么样呢?
我怎样才能得到一个普通的List来处理呢?我注意到一个List[Object]。在这方面也没有找到任何东西。嗯。有人能给予一个不使用反射的例子吗?

wz3gfoph

wz3gfoph1#

x具有类型MethodSymbol,因此if(x.equals("value id")) "xxx" else x具有类型Any(又名Object),因为这是StringMethodSymbol的最小超类型。
而且x.equals("value id")总是false,因为MethodSymbolString是不同的类型。
试试看

val res1 = z.map(_.toString).map(x => if (x == "value id") "xxx" else x)

val res1 = z.map(_.name).map(x => if (x == "id") "xxx" else x)

请注意,Java .equals类似于Scala ==,Java ==类似于Scala eq

ltskdhd1

ltskdhd12#

这个val z = classAccessors[Z].map(_.toString())解决了这个问题。不确定它背后的所有事实,但是List[Object]转到了List[String]。

相关问题