Scalaは、参照透過性val
と呼ばれる概念をサポートするために、クラス(ケースクラスのフィールドを含む)で宣言されたものと同じ名前のメソッドを自動的に作成します。これは、をでオーバーライドできる理由でもあります。それでも懐疑的な場合は、次のように自分でテストできます。def
val
まず、単一のケースクラスでScalaファイルを作成します。
// MyCase.scala
case class MyCase(myField1: Int, myField2: String)
ここで、を使用してファイルをコンパイルしますscalac
。これにより、2つのクラスが作成されます。上記の例では、MyCase.class(実際のケースクラスタイプを表す)とMyCase $ .class(ケースクラスの自動生成されたコンパニオンオブジェクトを表す)を取得します。
$ scalac MyCase.scala
$ ls
MyCase$.class MyCase.class MyCase.scala
.class
これで、を使用して宣言したケースクラスに対応する結果のファイルを調べることができますjavap
。(javap
Javaバイトコードを調べるための標準ツール-JDKで一緒に配布されjavac
ます。)
$ javap -private MyCase
Compiled from "MyCase.scala"
public class MyCase extends java.lang.Object implements scala.Product,scala.Serializable{
private final int myField1;
private final java.lang.String myField2;
public static final scala.Function1 tupled();
public static final scala.Function1 curry();
public static final scala.Function1 curried();
public scala.collection.Iterator productIterator();
public scala.collection.Iterator productElements();
public int myField1();
public java.lang.String myField2();
public MyCase copy(int, java.lang.String);
public java.lang.String copy$default$2();
public int copy$default$1();
public int hashCode();
public java.lang.String toString();
public boolean equals(java.lang.Object);
public java.lang.String productPrefix();
public int productArity();
public java.lang.Object productElement(int);
public boolean canEqual(java.lang.Object);
private final boolean gd1$1(int, java.lang.String);
public MyCase(int, java.lang.String);
}
結果のクラスに、ケースクラスのフィールドに対応するprivate final int myField1
との両方があることに注意してください。についても同じです。public int myField1()
myField1
myField2
JVMメソッドでは、リターンタイプはメソッドシグネチャの一部ではありません。これは、2つのメソッドが同じ名前と同じ引数タイプを持っている場合、それらは競合するメソッド宣言であると見なされることを意味します。これは、引数をとらずにすでに存在def a: Array[Byte]
しているため、例でを宣言できないことを意味します。val a: String
アップデート:
ライブラリコードを見たところ、例によれば、ケースクラスは正常に機能するはずです。READMEには、ケースクラスの解析はREPLでは機能しないという注記があります。それがあなたの問題でしょうか?そうでない場合は、実際に発生しているエラーを投稿する必要があります。編集:気にしないでください、私はあなたがあなたの他の投稿へのあなたのリンクであなたが話しているエラーを見ます。その問題への対応を考えたら、あそこに投稿します。