【问题标题】:Why are default methods not allowed in annotation types in Java 8?为什么 Java 8 的注解类型中不允许使用默认方法?
【发布时间】:2014-04-21 15:42:55
【问题描述】:

今天瞥见了注解的奇妙世界,于是尝试了自己的代码,但它并不想编译:

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

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

您在sayHello1 中看到的是如何指定注释的默认参数。
不过我想知道的是,为什么不允许使用 sayHello2,它从 Java 8 开始就可用。

对我来说,它似乎提供了相同的功能,还是我在这里遗漏了什么?

另外,为什么注解从 Java 5 开始就可以访问默认方法体(尽管非常简单),而接口必须等到 Java 8?

【问题讨论】:

  • What I am wondering though, is why sayHello2 is not allowed since Java 8. 我用 jave JDK7 编译器说default methods are not supported in -source 1.7 (use -source 8 or higher to enable default methods)
  • 注解没有默认的方法体。它们只有默认值。它们本质上是属性。接口中的默认方法体允许接口在发布后发展,并提供行为(特征)的多重继承形式。

标签: java interface annotations java-8


【解决方案1】:

这个

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 以来 interfacedefault 方法的语法。您可以在此方法中执行任何操作。 对于只提供元数据而不提供行为的注释来说,情况并非如此。

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

他们没有。上面的两件事完全不同。

【讨论】:

    猜你喜欢
    • 2015-02-06
    • 2014-06-20
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多