Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Scala不在这里保留字段注释?_Java_Scala_Annotations - Fatal编程技术网

Java 为什么Scala不在这里保留字段注释?

Java 为什么Scala不在这里保留字段注释?,java,scala,annotations,Java,Scala,Annotations,我用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(RetentionPoli

我用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;
}
另一个在斯卡拉

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会丢失这里的注释?

这似乎有效:

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)