public class T4 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
A a = getChild();
B b = new ChildB();
b.test(a);//test方法需要的是子类,但是这里传入的是父类;
}
static A getChild(){
ChildA a = new ChildA();
a.setType("1");
a.setOther("2");
return a;
}
}
interface A{
public String getType();
}
class ChildA implements A{
String type=null;
String other=null;
public String getOther() {
return other;
}
public void setOther(String other) {
this.other = other;
}
@Override
public String getType() {
// TODO Auto-generated method stub
return type;
}
public void setType(String type){
this.type = type;
}
}
interface B<T>{
void test(T a);
}
class ChildB implements B<ChildA>{
@Override
public void test(ChildA a) {
System.out.println(a.getOther());
}
}
以上代码在main方法中的第三行代码,传入了一个父类参数,但是ChildB定义的是其子类,根据里氏代换原则,只有传入父类的地方,可以传入子类,但是在传入子类的地方传入父类却是违背里氏代换原则的,通常情况下是会报错的;但是这里实现了一个B接口后,这样的的实现却是可以的,并且还可以将值打印出来,这是为什么呢?
这是什么样的设计模式,名称叫什么呢,一下子却想不起来了!
============================================
后来咨询了相关的同事后,觉得这样写有这样写的好处,因为这里涉及到多个不同业务的处理,而不同的业务之间可能有不同的属性,如果是直接通过传入接口作为参数,那那个时候不同的业务处理起来就会受限制,通过采取这样继承泛型的接口,可以保证传入任何类型的字类都是可以的,从而满足不同的业务需求;但是这里也提到一点,这样的可读性并不好,因为这给后期其它的开发人员的维护带来了理解上的困难。