为Scala案例类生成了哪些方法?
我知道有些方法专门针对案例类生成:
其他人是什么?
另外,我看到我可以在任何案例类上调用productArity()。这是如何运作的?换句话说,为什么以下代码有效?
case class CaseClass()
object CaseClass {
val cc = new CaseClass()
cc.productArity
}
答案 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会自动定义equals
和canEqual
方法,但它也会为构造函数参数定义getter
方法。您还可以调用toString
方法。
案例类也是Product
的一个实例,因此继承了这些方法。这就是您致电productArity的原因。