老师,能不能对java的duck typing 缺点再举一个例子呢,看了视频还不是很明白

来源:6-2 duck typing的概念

IT小书童z

2018-02-26

http://img.mukewang.com/szimg/5a942c4300011ff108560500.jpg

1.定义一个接口,同时有readable 和 appendable 方法是可以的啊,为什么视频讲解中说不行?

写回答

3回答

ccmouse

2018-02-27

比如我有一个类,名字叫ReadWriter,实现了Readable和Appendable。别人要同时使用Readable和Appendable接口,那么别人要定义一个叫做ReadableAndAppendable接口。

然而我的ReadWriter虽然分别实现了Readable和Appendable,但是并没有实现ReadableAndAppendable。我要给别人用,也要“跟着改”,去实现ReadableAndAppendable。

我之后的例子里会采用Retriever和Poster模拟这样的任务,可以看到Go语言能够很自然的完成。您可以用这个Retriever和Poster的例子想想在Java中很难做到。

2
7
光荣交白卷哥
回复
ccmouse
好的,老师,我带着问题看看。
2018-03-04
共7条回复

bbmouse

2019-07-02

这个问题,我来说明下,假设同学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方法里,

4
1
lichever
老哥 这个例子举得很好啊,谢谢。 duck typing就是 不管你是什么,只看你能做什么。
2021-07-08
共1条回复

IT小书童z

提问者

2018-02-26

还有用的人会一路跟着改是什么意思?能够举个例子呢

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1908 问题

查看课程