空接口,没有任何抽象方法。 按常识理解,仅仅是标识。类似一个注解。 作用:达成共识、统一标准。可以实现 比如
if (xx interface of xxxInf){
doSomething();
}
案例 来源JDK 1.8
最经常遇到的一个:序列化
public interface Serializable {
}
JVM会识别是否实现了该接口,做序列化相关的。也就是JVM底层是根据这个【标识】底层会做相应的处理。
那如果底层不支持额外的处理呢? 比如
/**
* A marker interface identifying asynchronous tasks produced by
* {@code async} methods. This may be useful for monitoring,
* debugging, and tracking asynchronous activities.
*
* @since 1.8
*/
public static interface AsynchronousCompletionTask {
}
再比如 spring 里面的
public interface Aware {
}
契约作用: 举个例子, 如果直接依赖实现类的话, 一个开发人员有一天修改了这个实现类的方法签名, 那么给他带来的是, 编译的时候所有引用这个方法的报错. 但是如果是有接口的话, 应该是只有报没有实现该接口的错误. 在这个地方, 接口就是作为一种契约, 是这种契约是给编译器的, 同时也是给开发人员的 -- 告诉开发人员说这里就是应该这么写的, 换句话说, 写接口的人和实现的人是可以分开的, 有了接口的话, 可以快速定位到打破契约的行为.
也就是用户扩展时,需要遵循这个特性,达成共识。