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

时间:2014-04-21 15:42:55

标签: java interface annotations java-8

我今天看到了一个精彩的注释世界的一瞥,所以我尝试了自己的代码,但它不想编译:

public @interface SomeAnnotation {
    public String sayHello1() default "Hello world";

    default public String sayHello2() {
        return "Hello world";
    }
}

您在sayHello1中看到的是如何指定注释的默认参数 我想知道的是,为什么不允许使用sayHello2,这是自Java 8以来可用的。

对我而言似乎提供相同的功能,或者我在这里遗漏了什么?

另外,为什么注释可以访问自Java 5以来的默认方法体(尽管非常简单),而接口必须等到Java 8?

1 个答案:

答案 0 :(得分:10)

public String sayHello1() default "Hello world";

提供注释元素的默认值。也就是说,如果你没有在注释中提供它,那就是它所具有的价值。 From the JLS

  

注释类型的主体可以包含方法声明,每个   其中定义了注释类型的元素。注释类型   没有明确的方法定义的元素   声明。

  

注释类型元素可以具有由...指定的默认值   使用关键字跟随元素的(空)参数列表   defaultElementValue(§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以来defaultinterface方法的语法。您可以在此方法中执行任何操作。 对于仅提供元数据而非行为的注释,情况并非如此。

  

此外,为什么注释可以访问默认方法体(尽管如此)   非常简单的)自Java 5以来,接口不得不等到   Java 8?

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