更新时间:2022-05-18 22:51:28
您可能想查看 这篇博客文章介绍了案例类到底是什么以及它们为何如此有用.
You might want to check out this blog article covering what case classes exactly are and why they are so useful.
在您的示例中,特征 MyTrait
没有用,除了能够像 java 接口一样运行.请注意,Scala 中的默认可见性是公开的.默认情况下,case 类参数是不可变的,因此在您的示例中 val
由编译器自动推断为 myStringVal
参数.
In your example, the trait MyTrait
has no use, except being able to function like a java interface. Note, that the default visibility in scala is public. By default case class parameters are immutable so in your example val
is automatically inferred by the compiler for the myStringVal
argument.
案例类有什么魔法?!
val
)toString()
、equals()
和hashcode()
方法apply()
和 unapply()
方法,它们基本上只是一个方便的构造函数,允许在不使用 new
关键字和一个提取器,默认情况下它会生成一个选项包装的 tuple
案例类参数.val
) by default fieldstoString()
, equals()
and hashcode()
methods using all constructor params for each methodapply()
and unapply()
method, which are basically just a convenience constructor allowing to instantiate without using the new
keyword and an extractor which by default generates an option-wrapped tuple
of the case class parameters.(案例)类的示例编译器输出(复制自 scalatutorial.de)
Sample compiler output for (case) classes (copied from scalatutorial.de)
一个简单的Scala类定义,如
A simple scala class definition like
class A1(v1: Int, v2: Double)
被编译成java代码
public class A1 extends java.lang.Object implements scala.ScalaObject {
public A1(int, double);
}
类似的案例类
case class A2(v1: Int, v2: Double)
被编译为以下 java 类
gets compiled to the following java classes
public class A2 extends java.lang.Object implements
scala.ScalaObject,scala.Product,java.io.Serializable {
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 double copy$default$2();
public int copy$default$1();
public int v1();
public double v2();
public A2 copy(int, double);
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);
public A2(int, double);
}
public final class A2$ extends scala.runtime.AbstractFunction2
implements scala.ScalaObject {
public static final A2$ MODULE$;
public static {};
public scala.Option unapply(A2);
public A2 apply(int, double);
public java.lang.Object apply(java.lang.Object, java.lang.Object);
}