当前位置: 首页 > 知识库问答 >
问题:

重写unapply方法

隗俊誉
2023-03-14

我有一个库类中的案例,我想覆盖unapplication方法以减少我需要传递的参数数量以对其进行模式匹配。我这样做:

object ws1 {
  // a library class
  case class MyClass(a: Int, b: String, c: String, d: Double /* and many more ones*/)

  // my object I created to override unapply of class MyClass
  object MyClass {
    def unapply(x: Int) = Some(x)
  }

  val a = new MyClass(1, "2", "3", 55.0 /* and many more ones*/)
  a match {
    case MyClass(x /*only the first one is vital*/) => x  // java.io.Serializable = (1,2,3,55.0)
    case _ => "no"
  }
}

但我希望它只返回1。这有什么问题?

共有2个答案

楚墨一
2023-03-14

我会不情愿地抛弃重载,只在比赛中使用以下内容:

a match {
  case MyClass(x, _, _, _) => x  // Result is: 1
  case _ => "no"
}

编辑:

如果您真的想避免使用额外的下划线,我认为您需要查看以下内容:

a match {
  case x:MyClass => x.a
  case _ => "no"
}
文国发
2023-03-14
case class MyClass(a: Int, b: String, c: String, d: Double /* and many more ones*/)
object MyClassA {
   def unapply(x: MyClass) = Some(x.a)
}

val a = new MyClass(1, "2", "3", 55.0 /* and many more ones*/)

a match {
    case MyClassA(2) => ??? // does not match
    case MyClassA(1) => a   // matches
    case _ => ??? 
}

您不能在MyClass对象中定义自定义的方法,因为它必须采用MyClass参数,并且已经有一个这样的方法,一个是为case类自动生成的。因此,您必须在不同的对象中定义它(本例中为MyClassA)。

Scala中的模式匹配获取您的对象并对其应用多个unappsunapple ySeq方法,直到它获得与模式中指定的值匹配的值的一些
MyClassA(1)匹配aifMyClassA. unapplication(a)==一些(1)

注意:如果我写了case m@MyClassA(1)=

编辑:

a match {
    case MyClassA(x) => x  // x is an Int, equal to a.a
    case _ => ??? 
}

 类似资料:
  • subA类是A类的子类。我试图重写一个方法,但不知怎的,它不允许我重写它。为什么会这样?是因为参数中的参数吗? 读取错误消息: 名称冲突:subA中的add(E#1)和A中的add(E#2)具有相同的擦除,但两者都不重写另一个,其中E#1、E#2是类型变量: E#1扩展了subA类中声明的对象 E#2扩展了A类中声明的对象 超类A: 子类subA:

  • 在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为 方法重写(override),又称为 方法覆盖。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写。 子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。 在重写方法时,需要遵循

  • 下面是这本书的一段话: 覆盖方法不得抛出比覆盖方法声明的异常新的或更广泛的检查异常。例如,声明FileNotFoundException的方法不能被声明SQLException、Exception或任何其他非运行时异常的方法覆盖,除非它是FileNotFoundException的子类。 现在我的问题是,如果超类中的方法抛出一个异常,那么重写方法能否根本不抛出一个异常? 因为我刚刚在Java中尝试

  • 这里我有两个类DemoParent和DemoChild,它们扩展了DemoParent,在DemoParent中我有通用方法m1(int I),但在DemoChild中我有varargs方法m1(int…I)。当我创建子类的对象并调用m1方法时,它会给我父类方法输出。请参见下面的输出。o/p-母公司 有人能解释为什么父类方法总是从子类引用调用,即使子类具有相同的方法? 但是如果我们反向代码,即父类

  • 问题内容: 我正在记录我已经开发的Java程序,并且想知道如果仅记录超类,是否将为继承的方法(被重写)生成JavaDoc? 如果我有一个用方法调用的类,而有一个用该方法重写的子类,那么如果Car类中没有放置Javadoc,Carss驱动方法中是否会包含Vehicles驱动方法的文档? 问题答案: [I]想知道如果我仅记录超类,是否将为继承的方法(被重写)生成JavaDoc? 是。如果在子类上没有j

  • 主要内容:如何调用被重写的方法前面讲过在 Python 中,子类继承了父类,那么子类就拥有了父类所有的类属性和类方法。通常情况下,子类会在此基础上,扩展一些新的类属性和类方法。 但凡事都有例外,我们可能会遇到这样一种情况,即子类从父类继承得来的类方法中,大部分是适合子类使用的,但有个别的类方法,并不能直接照搬父类的,如果不对这部分类方法进行修改,子类对象无法使用。针对这种情况,我们就需要在子类中重复父类的方法。 举个例子,鸟通