import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.stereotype.Component;
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Component
public @interface A{
public B b() default B.NONE;
public Class<? extends D<?>>d() default E.class;
}
其中几个类和枚举是这样写的
public enum B{
ALL((byte) 0x3),
NONE((byte) 0),
;
B(byte m) {
this.m= m;
}
private byte m;
public boolean k(B b) {
return 0 != (this.m& B.m);
}
}
public interface D<T> {
T v(Object target, Object… args);
}
public class E implements D<Object> {
@Override
public Object v(Object target, Object… args) {
return null;
}
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.stereotype.Component;
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Component
public @interface A{
public B b() default B.NONE;
public Class<? extends D<?>>d() default E.class;
}
其中几个类和枚举是这样写的
public enum B{
ALL((byte) 0x3),
NONE((byte) 0),
;
B(byte m) {
this.m= m;
}
private byte m;
public boolean k(B b) {
return 0 != (this.m& B.m);
}
}
public interface D<T> {
T v(Object target, Object… args);
}
public class E implements D<Object> {
@Override
public Object v(Object target, Object… args) {
return null;
}
}
解决方案
20
什么是default方法?
Java 8发布以后,可以给接口添加新方法,但是,接口仍然可以和它的实现类保持兼容。这非常重要,原因是你开发的类库可能正在被多个开发者广泛的使用着。而Java 8之前,在类库中发布了一个接口以后,假如在接口中添加一个新方法,那些实现了这个接口的应用使用新版本的接口就会有崩溃的危险。
有了Java 8,是不是就没有这种危险了?答案能否定的。
给接口添加default方法可能会让某些实现类不可用。
首先,让我们看下default方法的细节。
在Java 8中,接口中的方法可以被实现(Java8中的static的方法也可以在接口中实现,但这是另一个话题)。接口中被实现的方法叫做default方法,用关键字default作为修饰符来标识。当一个类实现一个接口的时候,它可以实现已经在接口中被实现过的方法,但这不是必须的。这个类会继承default方法。这就是为什么当接口发生改变的时候,实现类不需要做改动的原因。
多继承的时候呢?
当一个类实现了多于一个(例如两个)接口,而这些接口又有同样的default方法的时候,事情就变得很复杂了。类继承的是哪一个default方法呢?哪一个也不是!在这种情况下,类要本人(直接或是继承树上更上层的类)来实现default方法(才可以)。
当一个接口实现了default方法,另一个接口把default方法声明成了abstract的时候,同样如此。Java 8试图避免不明确的东西,保持严谨。假如一个方法在多个接口中都有声明,那么,任何一个default实现都不会被继承,你将会得到一个编译时错误。
但是,假如你已经把你的类编译过了,那就不会出现编译时错误了。在这一点上,Java 8是不一致的。它有它本人的原因,有于各种原因,在这里本人不想详细的说明或是深入的讨论(原因是:版本已经发布了,讨论时间太长,这个平台从来没有这样的讨论)。
1.假设你有两个接口,一个实现类。
2.其中一个接口实现了一个default方法m()。
3.把接口和实现类一块编译。
4.修改那个没有包含m()方法的接口,声明m()方法为abstract。
5.单独重新编译修改过的接口。
6.运行实现类。
Java 8发布以后,可以给接口添加新方法,但是,接口仍然可以和它的实现类保持兼容。这非常重要,原因是你开发的类库可能正在被多个开发者广泛的使用着。而Java 8之前,在类库中发布了一个接口以后,假如在接口中添加一个新方法,那些实现了这个接口的应用使用新版本的接口就会有崩溃的危险。
有了Java 8,是不是就没有这种危险了?答案能否定的。
给接口添加default方法可能会让某些实现类不可用。
首先,让我们看下default方法的细节。
在Java 8中,接口中的方法可以被实现(Java8中的static的方法也可以在接口中实现,但这是另一个话题)。接口中被实现的方法叫做default方法,用关键字default作为修饰符来标识。当一个类实现一个接口的时候,它可以实现已经在接口中被实现过的方法,但这不是必须的。这个类会继承default方法。这就是为什么当接口发生改变的时候,实现类不需要做改动的原因。
多继承的时候呢?
当一个类实现了多于一个(例如两个)接口,而这些接口又有同样的default方法的时候,事情就变得很复杂了。类继承的是哪一个default方法呢?哪一个也不是!在这种情况下,类要本人(直接或是继承树上更上层的类)来实现default方法(才可以)。
当一个接口实现了default方法,另一个接口把default方法声明成了abstract的时候,同样如此。Java 8试图避免不明确的东西,保持严谨。假如一个方法在多个接口中都有声明,那么,任何一个default实现都不会被继承,你将会得到一个编译时错误。
但是,假如你已经把你的类编译过了,那就不会出现编译时错误了。在这一点上,Java 8是不一致的。它有它本人的原因,有于各种原因,在这里本人不想详细的说明或是深入的讨论(原因是:版本已经发布了,讨论时间太长,这个平台从来没有这样的讨论)。
1.假设你有两个接口,一个实现类。
2.其中一个接口实现了一个default方法m()。
3.把接口和实现类一块编译。
4.修改那个没有包含m()方法的接口,声明m()方法为abstract。
5.单独重新编译修改过的接口。
6.运行实现类。