Когда вы создаете класс case, компилятор создает соответствующий объект-компаньон с несколькими полезностями класса case: метод фабрики apply
, соответствующий первичному конструктору, equals
, hashCode
и copy
.
Как ни странно, этот сгенерированный объект расширяет FunctionN.
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)