Java接口中的缺省方法返回值

时间:2010-09-29 11:26:19

标签: java interface annotations language-features

在处理注释时,我偶然发现了以下代码(这是Hibernate @NotNull注释):

@Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {})
public @interface NotNull {

    @Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
    @Retention(value = RetentionPolicy.RUNTIME)
    @Documented
    public @interface List {

        public NotNull[] value();
    }

    public String message() default "{javax.validation.constraints.NotNull.message}";

    public Class<?>[] groups() default {};

    public Class<? extends Payload>[] payload() default {};
}

我想知道方法定义中的default关键字/构造,这是我以前从未见过的。据我所知,它允许您为此方法(或注释属性)定义默认值。

现在我试图将此构造应用于普通接口,但它失败了。这将无法编译:

public interface DefaultTest {
    public String test() default "value";
}

但这可行:

public @interface DefaultTest {
    public String test() default "value";
}

所以我的问题是: default关键字注释是否特定?如果是,那么在正常的接口定义中反对使用这个结构的是什么?

2 个答案:

答案 0 :(得分:21)

Java 8及以后

是的,现在可以在接口上使用default关键字。有关详细信息,请参阅Oracle's docs

实施与您的想法略有不同。它将是:

public interface DefaultTest {
    default public String test() {
        return "value";
    }
}

Java 7和之前的

默认关键字只能用于注释。

如果您想要接口的默认返回值,则需要使用抽象类。

public abstract class DefaultTest {

  public String test() {
    return "value";
  }

}

答案 1 :(得分:6)

&#39;默认&#39;这里的关键字不是特定的注释。 它的特性是为接口方法提供默认实现。

需要此行为 假设最初定义了一个界面Vehicle以支持所有车辆功能方法 -

interface Vehicle {
  void speed();

  ... 
  //other interface methods
} 

现在,实现此Vehicle接口的类已实现了这些抽象方法。

现在未来车辆具备飞行能力。所以你还需要添加飞行功能。 现在,如果将flyingSpeed()方法添加到Vehicle接口,则需要修改所有现有类以避免破坏代码。 不可行的解决方案。

为了向后兼容,java提供了Default方法的功能。这样您就可以添加新方法来与默认实现进行交互,因此现有类不需要实现该方法。新的Vehicle类可以根据需要覆盖这些方法。

interface Vehicle {
  void speed();

  ...
  //other interface methods

  //default method
  default void flyingSpeed() {
    System.out.println("Default flying speed");
  }
}

使用这种方式,以前现有的车辆类别不需要实施此方法。

有关详细信息see,请点击此处。