在Java中,子类覆写父类方法时,方法返回值类型并不需要与父类完全一致,二者兼容即可。该原则同时适用于接口的实现及抽象方法的实现。在实现适配器设计模式时,该原则产生了很大的作用。
下面附上相关的代码和说明:
<span style="white-space:pre"> </span>public interface BaseHandler {
<span style="white-space:pre"> </span>Object handle(Object object);
<span style="white-space:pre"> </span>}
BaseHandler接口,处理一个Object对象生成一个Object对象。是一个通用处理器。
<span style="white-space:pre"> </span>public static void main(String[] args) {
<span style="white-space:pre"> </span>run(mBaseHandler, mObject);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public static void run(BaseHandler handler, Object object){
<span style="white-space:pre"> </span>System.out.println(handler.handle(object));
<span style="white-space:pre"> </span>}
程序入口,run方法调用一个BaseHandler处理一个Object对象。是一个通用方法。
<span style="white-space:pre"> </span>public class SpecificHandler {
<span style="white-space:pre"> </span>public Integer handle(Double num){
<span style="white-space:pre"> </span>return 0;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
SpecificHandler,特定处理器类,用来处理特定情况的类。该类与BaseHandler具有相同的接口元素。这种类可以有多个,分别对对象进行不同的处理。
<span style="white-space:pre"> </span>public class Adapter implements BaseHandler{
<span style="white-space:pre"> </span>SpecificHandler mSpecificHandler;
<span style="white-space:pre"> </span>public Adapter(SpecificHandler specificHandler){
<span style="white-space:pre"> </span>this.mSpecificHandler = specificHandler;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public Integer handle(Object object) {
<span style="white-space:pre"> </span>return this.mSpecificHandler.handle((Double)object);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
Adapter适配器。在构造方法中接受所拥有的接口(SpecificHandler),并通过实现BaseHandler接口的方式生成可用于通用方法的接口(BaseHandler)。覆写BaseHandler的handle方法时,将返回值类型改为Integer,在handler方法中使用SpecificHandler的handle方法,来达到处理特定问题的目的。
Java中的适配器模式,就是将一个或多个处理具体问题的工具类,通过上述方式给予一个公用的接口,提高代码的可复用性。