我今天看到了一个精彩的注释世界的一瞥,所以我尝试了自己的代码,但它不想编译:
public @interface SomeAnnotation {
public String sayHello1() default "Hello world";
default public String sayHello2() {
return "Hello world";
}
}
您在sayHello1
中看到的是如何指定注释的默认参数
我想知道的是,为什么不允许使用sayHello2
,这是自Java 8以来可用的。
对我而言似乎提供相同的功能,或者我在这里遗漏了什么?
另外,为什么注释可以访问自Java 5以来的默认方法体(尽管非常简单),而接口必须等到Java 8?
答案 0 :(得分:10)
此
public String sayHello1() default "Hello world";
提供注释元素的默认值。也就是说,如果你没有在注释中提供它,那就是它所具有的价值。 From the JLS
注释类型的主体可以包含方法声明,每个 其中定义了注释类型的元素。注释类型 没有明确的方法定义的元素 声明。
和
注释类型元素可以具有由...指定的默认值 使用关键字跟随元素的(空)参数列表
default
和ElementValue
(§9.7.1)。
所以
@SomeAnnotation // sayHello1 would have value "Hello world"
public class Foo {}
和
@SomeAnnotation(sayHello1 = "other value") // sayHello1 would have value "other value"
public class Foo {}
然后
SomeAnnotation ann = ...;
String value = ann.sayHello1();
如果您未提供default
值,则必须在注释时提供值。
此
default public String sayHello2() {
return "Hello world";
}
是自Java 8以来default
中interface
方法的语法。您可以在此方法中执行任何操作。 对于仅提供元数据而非行为的注释,情况并非如此。
此外,为什么注释可以访问默认方法体(尽管如此) 非常简单的)自Java 5以来,接口不得不等到 Java 8?
他们没有。以上两点完全不同。