为Scala案例类生成了哪些方法?

时间:2015-07-13 12:01:56

标签: scala case-class

为Scala案例类生成了哪些方法?

我知道有些方法专门针对案例类生成:

  • 等于
  • canEqual

其他人是什么?

另外,我看到我可以在任何案例类上调用productArity()。这是如何运作的?换句话说,为什么以下代码有效?

case class CaseClass()

object CaseClass {
  val cc = new CaseClass()
  cc.productArity
}

3 个答案:

答案 0 :(得分:4)

在Scala中为特定类生成哪些方法的好方法是使用javap命令。

找到由scalac编译的.class文件,然后从相应的命令行工具上运行javap -private命令。这将显示类的构造函数,字段和所有方法。

您可以为您的案例类执行此操作,以查看Scala自动提供的内容。

案例类混合提供Product方法的productArity特征。对于案例类,productArity方法将返回类定义中提供的参数列表的计数。

答案 1 :(得分:4)

鉴于 Test.scala -

case class Test()

您可以运行scalac Test.scala -print来确切了解生成的内容

[[syntax trees at end of                   cleanup]] // Test.scala
package com {
  case class Test extends Object with Product with Serializable {
    <synthetic> def copy(): com.Test = new com.Test();
    override <synthetic> def productPrefix(): String = "Test";
    <synthetic> def productArity(): Int = 0;
    <synthetic> def productElement(x$1: Int): Object = {
      case <synthetic> val x1: Int = x$1;
      case4(){
        matchEnd3(throw new IndexOutOfBoundsException(scala.Int.box(x$1).toString()))
      };
      matchEnd3(x: Object){
        x
      }
    };
    override <synthetic> def productIterator(): Iterator = runtime.this.ScalaRunTime.typedProductIterator(Test.this);
    <synthetic> def canEqual(x$1: Object): Boolean = x$1.$isInstanceOf[com.Test]();
    override <synthetic> def hashCode(): Int = ScalaRunTime.this._hashCode(Test.this);
    override <synthetic> def toString(): String = ScalaRunTime.this._toString(Test.this);
    override <synthetic> def equals(x$1: Object): Boolean = {
  case <synthetic> val x1: Object = x$1;
  case5(){
    if (x1.$isInstanceOf[com.Test]())
      matchEnd4(true)
    else
      case6()
  };
  case6(){
    matchEnd4(false)
  };
  matchEnd4(x: Boolean){
    x
  }
}.&&(x$1.$asInstanceOf[com.Test]().canEqual(Test.this));
    def <init>(): com.Test = {
      Test.super.<init>();
      scala.Product$class./*Product$class*/$init$(Test.this);
      ()
    }
  };
  <synthetic> object Test extends scala.runtime.AbstractFunction0 with Serializable {
    final override <synthetic> def toString(): String = "Test";
    case <synthetic> def apply(): com.Test = new com.Test();
    case <synthetic> def unapply(x$0: com.Test): Boolean = if (x$0.==(null))
      false
    else
      true;
    <synthetic> private def readResolve(): Object = com.this.Test;
    case <synthetic> <bridge> <artifact> def apply(): Object = Test.this.apply();
    def <init>(): com.Test.type = {
      Test.super.<init>();
      ()
    }
  }
}

答案 2 :(得分:1)

确实,case classe会自动定义equalscanEqual方法,但它也会为构造函数参数定义getter方法。您还可以调用toString方法。

案例类也是Product的一个实例,因此继承了这些方法。这就是您致电productArity的原因。