При создании класса case компилятор создает соответствующий сопутствующий объект с несколькими достоинствами класса case: метод apply
factory, соответствующий основному конструктору, equals
, hashCode
и copy
.
Как ни странно, этот сгенерированный объект расширяет функциональность.
scala> case class A(a: Int)
defined class A
scala> A: (Int => A)
res0: (Int) => A = <function1>
Это только в том случае, если:
- Не указано вручную сопутствующий объект
- Существует только один список параметров
- Нет аргументов типа
- Класс case не является абстрактным.
Похоже, что это было добавлено около двух лет назад. Последнее воплощение здесь.
Кто-нибудь использует это или знает, почему он был добавлен? Он немного увеличивает размер сгенерированного байт-кода со статическими методами пересылки и появляется в методе #toString()
для сопутствующих объектов:
scala> case class A()
defined class A
scala> A.toString
res12: java.lang.String = <function0>
UPDATE
Созданные вручную объекты с помощью одного метода apply
автоматически не рассматриваются как FunctionN
:
object HasApply {
def apply(a: Int) = 1
}
val i = HasApply(1)
// fails
// HasApply: (Int => Int)