Java接口中的默认方法返回值
在处理注释时,我无意中发现了以下代码(这是Hibernate@NotNull注释): 但这是可行的:Java接口中的默认方法返回值,java,interface,annotations,language-features,Java,Interface,Annotations,Language Features,在处理注释时,我无意中发现了以下代码(这是Hibernate@NotNull注释): 但这是可行的: public @interface DefaultTest { public String test() default "value"; } 所以我的问题是:默认的关键字注释是特定的吗?如果是的话,在普通的接口定义中使用这种结构有什么不好的地方呢?Java8及以后的版本 是的,现在可以在接口上使用默认关键字。有关更多详细信息,请参阅 实现与您的想法略有不同。它将是: public i
public @interface DefaultTest {
public String test() default "value";
}
所以我的问题是:默认的
关键字注释是特定的吗?如果是的话,在普通的接口定义中使用这种结构有什么不好的地方呢?
Java8及以后的版本
是的,现在可以在接口上使用默认关键字。有关更多详细信息,请参阅
实现与您的想法略有不同。它将是:
public interface DefaultTest {
default public String test() {
return "value";
}
}
Java 7及以前版本
默认关键字只能用于批注
如果您想要接口的默认返回值,则需要使用抽象类
public abstract class DefaultTest {
public String test() {
return "value";
}
}
此处的“default”关键字不是特定于注释的。 java的特性是为接口方法提供默认实现 需要这种行为: 假设最初定义了一个接口车辆以支持所有车辆功能方法-
interface Vehicle {
void speed();
...
//other interface methods
}
现在实现这个车辆接口的类已经实现了这些抽象方法
现在,未来的飞行器具有飞行能力。因此,您还需要添加飞行功能。
现在,如果将flyingSpeed()方法添加到Vehicle接口,则需要修改所有现有类以避免破坏代码。
不可行的解决方案
为了向后兼容,java提供了默认方法的特性。这样您就可以添加新方法来与默认实现接口,这样现有类就不需要实现该方法。新的车辆类别可以根据需要覆盖这些方法
interface Vehicle {
void speed();
...
//other interface methods
//default method
default void flyingSpeed() {
System.out.println("Default flying speed");
}
}
使用这种方式,以前现有的车辆类别就不需要实现这种方法
有关更多信息,请参见此处。多接口继承非常有意义。谢谢你指出这一点。事实证明你是有先见之明的。Java8现在可以让你做你想做的事情!我已经更新了我的答案。
interface Vehicle {
void speed();
...
//other interface methods
}
interface Vehicle {
void speed();
...
//other interface methods
//default method
default void flyingSpeed() {
System.out.println("Default flying speed");
}
}