Ответ 1
Возможно, вы захотите проверить эту статью в блоге, в которой описаны классы случаев и почему они так полезны.
В вашем примере признак MyTrait
не имеет смысла, кроме возможности работать как java-интерфейс. Обратите внимание, что видимость по умолчанию в scala является общедоступной. По умолчанию параметры класса case неизменяемы, поэтому в вашем примере val
автоматически выводится компилятором для аргумента myStringVal
.
Какую магию делают классы классов?!
- Преобразование всех параметров конструктора в public readonly (
val
) по умолчанию. - Создайте методы
toString()
,equals()
иhashcode()
, используя все параметры конструктора для каждого метода - Создайте сопутствующий объект с тем же именем, содержащий соответствующий метод
apply()
иunapply()
, который в основном представляет собой конструктор удобства, позволяющий создавать экземпляр без использования ключевого словаnew
и экстрактора, который по умолчанию генерирует опциональную оболочкуtuple
параметров класса case.
EDIT: Пример вывода компилятора для классов (case) (скопирован из scalatutorial.de)
Простое определение класса scala, например
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
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);
}