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