Я написал процессор макросов для аннотаций, который генерирует все те же методы, которые вы получили бы при объявлении класса case, но обеспечивающий хеш-обработку. Это было немного сложно, но в целом я очень доволен результатами. Тем не менее, я вижу некоторое поведение в отношении метода apply
, который мне еще предстоит решить.
Раньше, когда класс Foo
был классом дела или имел метод apply
, определенный вручную, я мог написать код, подобный foos.map(Foo)
. Однако теперь, когда метод сгенерирован макропроцессором, он выдаст сообщение об ошибке, подобное следующему
type mismatch;
[error] found : Foo.type
[error] required: String => ?
Теперь я могу просто переписать код как foos.map(Foo.apply)
или foos.map(Foo(_))
, и он будет работать, но я не смог разглядеть какую-либо разницу в генерируемом коде, которая могла бы вызвать эту разницу в поведении.
Я подозреваю, что это что-то вроде компилятора Scala, который слишком охотно разрешает символ в имени типа, а не в имени объекта или чем-то подобном, но если есть способ сделать это лучше, было бы полезно знать.