代码之家  ›  专栏  ›  技术社区  ›  MicSim

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

  •  14
  • MicSim  · 技术社区  · 14 年前

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

    关键字注释特定?如果是的话,在正常的接口定义中使用这个构造有什么反对的呢?

    2 回复  |  直到 11 年前
        1
  •  25
  •   Pace    9 年前

    Java 8及更高版本

    Oracle's docs .

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

    Java 7及以前版本

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

    public abstract class DefaultTest {
    
      public String test() {
        return "value";
      }
    
    }
    
        2
  •  6
  •   gtm.r    10 年前

    此处的“default”关键字不是特定于注释的。

    这种行为的需要: 假设最初定义了一个接口车辆来支持所有车辆功能方法-

    interface Vehicle {
      void speed();
    
      ... 
      //other interface methods
    } 
    

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

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

    为了向后兼容,java提供了Default方法的特性。这样您就可以添加新方法来与默认实现接口,这样现有的类就不需要实现该方法了。新的车辆类可以根据需要覆盖这些方法。

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

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

    了解更多信息 see

    推荐文章