在Scala中访问不同类的相同名称的参数

时间:2015-05-15 11:30:24

标签: scala private public

我有一个非常具体的场景,其中我有一些不同的抽象类,它们具有可以具有不同参数的子案例类,例如:

abstract class ball() {}

case class football(_name: String, _shape: String) extends ball

case class basketball(_name: String, _size: Int) extends ball

和另一个抽象类:

abstract class food() {}

case class vegetarian(_name: String, calories: Int) extends food

case class meat(_name: String, proteinCount: Int) extends food

现在,我面临的问题是我需要以某种方式提取所有这些的名称而不知道它是什么类,我只知道ALWAYS,每个CLASS都有一个名为_name的参数。

假设我们有上述任何类别的object,我试图这样做:

object.getClass.getDeclaredField("_name").get(this)

但我收到了错误:

can not access a member of class package.food with modifiers "private"

我尝试在类中将val和var放在参数之前,但它没有帮助。我也试过做#34; setAccessible(true)"在get(this)之前的一行,这也没有帮助。

1 个答案:

答案 0 :(得分:1)

显而易见的清洁解决方案是对所有这些类别至少具有共同特征:

trait HasName {
  def _name: String
}

然后你可以放心地obj.asInstanceOf[HasName]._name。更好的是,如果您设法保留objHasName的静态信息,在这种情况下obj._name就足够了。

如果你不能做到这一点,反思是要走的路。您可以使用结构类型轻松地完成此操作,在这种情况下:

obj.asInstanceOf[{ def _name: String }]._name

请注意,这将比上面的HasName解决方案慢,并且在编译时完全取消选中。