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

在Scala中访问不同类的同名参数,scala,private,public,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

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

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
现在,我面临的问题是,我需要以某种方式提取所有这些的名称,而不知道它是什么类,我只知道每个类都有一个名为
\u name
的参数

假设我们有上述任何一个类的
对象
,我尝试这样做:

object.getClass.getDeclaredField("_name").get(this)
但我得到了一个错误:

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

我试着在课堂上把val和var放在参数之前,但没用。我还试着在get(this)之前在一行中执行“setAccessible(true)”,这也没有帮助

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

trait HasName {
  def _name: String
}
然后您可以安全地执行[HasName]的[code>obj.asinstance.\u name。如果您设法保留
obj
HasName
的静态信息,则更好,在这种情况下
obj.\u name
就足够了

如果你不能做到这一点,那么反思就是一条出路。使用结构类型可以非常轻松地完成此操作,在本例中:

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

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

请您确切解释第二个解决方案是如何工作的?我复制了它并在我的项目中发挥了作用,但我不完全理解它。非常感谢。另外,如何实现同名方法的类似解决方案?scalac编译器使用Java反射(至少在JVM上)实现对结构类型方法的调用。类似于
obj.getClass.getMethod(“\u name”,classOf[String]).invoke(obj)
,给出一个简化的想法。