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

12

今天我看到了注解这个奇妙的世界,于是尝试写了自己的代码,但它无法编译:

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

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

sayHello1中看到的是如何指定注释默认参数的方式。
但我想知道的是,为什么sayHello2不被允许,虽然它自Java 8以来就可用。

对我来说,它似乎提供了相同的功能,或者我漏掉了什么?

此外,为什么自Java 5以来注释可以访问默认方法体(虽然非常简单),而接口要等到Java 8才能访问?


我想知道的是,为什么Java 8之后不允许使用sayHello2方法。我使用的是JDK7,编译器显示“默认方法在-source 1.7中不受支持(请使用-source 8或更高版本启用默认方法)”。 - BackSlash
1
注解没有默认的方法体。它们只有默认值。本质上,它们是属性。接口中的默认方法体允许接口在发布后演变,并提供一种行为的多重继承形式(特征)。 - David Conrad
1个回答

14

这个

public String sayHello1() default "Hello world";

提供注释元素的默认值。也就是说,如果您在注释中没有提供它,那么它将具有该值。 来自JLS

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

另外,注释类型元素可以具有默认值,通过在元素(空)参数列表后面跟随关键字“default”和ElementValue(§9.7.1)指定。

因此:

@SomeAnnotation // sayHello1 would have value "Hello world"
public class Foo {}
and
@SomeAnnotation(sayHello1 = "other value") // sayHello1 would have value "other value"
public class Foo {}
然后。
SomeAnnotation ann = ...;
String value = ann.sayHello1();
如果您不提供默认值,则在注释某些内容时必须提供一个值。
这个。
default public String sayHello2() {
    return "Hello world";
}

default 方法语法是 Java 8 中接口的一种方法,您可以在此方法中执行任何操作。但注释仅提供元数据而不提供行为。

那么,为什么注释从 Java 5 开始就可以访问默认方法(虽然非常简单),而接口要等到 Java 8 才能使用?

事实并非如此。上述两个事物完全不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接