Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java接口中的默认方法返回值_Java_Interface_Annotations_Language Features - Fatal编程技术网

Java接口中的默认方法返回值

Java接口中的默认方法返回值,java,interface,annotations,language-features,Java,Interface,Annotations,Language Features,在处理注释时,我无意中发现了以下代码(这是Hibernate@NotNull注释): 但这是可行的: public @interface DefaultTest { public String test() default "value"; } 所以我的问题是:默认的关键字注释是特定的吗?如果是的话,在普通的接口定义中使用这种结构有什么不好的地方呢?Java8及以后的版本 是的,现在可以在接口上使用默认关键字。有关更多详细信息,请参阅 实现与您的想法略有不同。它将是: public i

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

但这是可行的:

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");
  }
}