在处理注释时,我偶然发现了以下代码(这是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
关键字注释是否特定?如果是,那么在正常的接口定义中反对使用这个结构的是什么?
答案 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,请点击此处。