首页 > 解决方案 > 为什么 Scala 不在这里保留字段注释?

问题描述

我有这个用 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();
}

我有这两个课。一个在 Java 中。

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

另一个在 Scala 中。

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 在这里丢失了注释?

标签: javascalaannotations

解决方案


这似乎有效:

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)

推荐阅读