这个问题,我来说明下,假设同学A写了一个方法copyFile,这个方法需要传入一个参数,这个参数需要既能读也能写,A同学就想,我们写代码一定要面向接口编程,所以写了一个接口CanReadAndWrite来作为方法的参数,代码大概长下面这样:
public interface CanReadAndWrite {
String read();
void write();
}
public static void copyFile(CanReadAndWrite rw) {
// TODO...做一些文件拷贝的工作
}
A同学想,我定义了这个公共方法,以后组里面的其他同事如果需要这个功能,调用这个方法就行了!!
然后B同学刚好也需要一个类似的copyFile的方法,B同学英语可能不咋滴,按他的理解,这个方法应该大概叫copySomething,于是他搜索来一下,发现没这样的方法,于是想自己封装一个,于是有来下面的代码:
public static <R extends Readable & Writeable> void copySomething(R r){
// TODO...做一些文件拷贝工作
}
B同学英语虽然不咋样,但是编程基础更好,他想传进来的参数既能读又能写,那这个对象应该实现读写的接口,他先到jdk中找有没有这样的接口,发现了Readable接口和Writeable接口(假设jdk有这两个接口,我这里是随便写的),于是就限定参数必须实现这两个接口,既然jdk已经提供了就不需要自己定义了嘛!(而且接口的功能应该是单一性的,A同学的这个接口定义的确实不咋地)
最后,问题出现了,这个A同学虽然编程思维不如B同学,但他是项目组老大,他说:B同学,你这个接口已经有现成的了(也就是他自己定义的copyFile),大家用的都是这个,不要搞特殊化了,你也用这个吧,此时B的功能开发的差不多了,现在如果要改成A的copyFile方法,传的参数就必须实现A同学的CanReadAndWrite接口,,,,
以上就是大概的说明,举的例子比较简单,项目中可能更复杂,大家可以展开想象,
duck typing的概念应该就是只要参数有read方法和write就行,我不用你实现啥接口,如果有duck typing,B同学的参数就能传到A同学定义的copyFile方法里,