Почему Scala не сохраняет здесь полевые аннотации? - PullRequest
0 голосов
/ 01 мая 2018

У меня есть эта аннотация, которую я написал на Java, поскольку Scala не позволяет определять аннотации с помощью политики хранения во время выполнения.

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface When {
    String event();
}

У меня есть эти два класса. Один на Яве.

public class TestJavaClass {
    @When(event = "something")
    public String someField;
}

Еще один в Скале.

case class TestScalaClass(@When(event = "something") someField: String)

Класс Java, когда он отражается, дает мне аннотацию, как и ожидалось. Вот сеанс Scala REPL, демонстрирующий это.

scala> classOf[TestJavaClass].getDeclaredField("someField").getAnnotations
res1: Array[java.lang.annotation.Annotation] = Array(@utils.When(event=something))

Однако класс Scala, хотя и выглядит так, как будто он должен быть идентичным в этом отношении, не делает.

scala> classOf[TestScalaClass].getDeclaredField("someField").getAnnotations
res2: Array[java.lang.annotation.Annotation] = Array()

Почему Scala теряет аннотацию здесь?

1 Ответ

0 голосов
/ 01 мая 2018

Это похоже на работу:

case class TestScalaClass(@(When @annotation.meta.field)(event = "something") someField: String)

Для артефактов метааннотация указывает, куда поместить аннотацию.

Документы предлагают псевдоним:

import annotation.meta._

object Helper {
  type Whenfield = When @field
}
import Helper._

case class TestScalaClass(@Whenfield(event = "something") someField: String)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...