为什么Java 8中的注释类型中不允许使用默认方法?

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

注释类型的主体可以包含方法声明,每个声明声明定义注释类型的元素.注释类型没有除显式声明的方法定义的元素之外的元素.

注释类型元素可以具有默认值,通过使用关键字defaultElementValue(第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?

他们没有.以上两点完全不同.