设计模式之禅中里氏替换原则代码例子的疑惑,请高手赐教

flowerzhouyan 2017-11-15 08:41:43
public class Father {
public Collection doSomething(HashMap map){
System.out.println("父类被执行...");

return map.values();

}
}
public class Son extends Father {
//放大输入参数类型
public Collection doSomething(Map map){
System.out.println("子类被执行...");
return map.values();
}
}
public class Client {
public static void invoker(){
//父类存在的地方,子类就应该能够存在
Son f =new Son();
HashMap map = new HashMap();
f.doSomething(map);
}
public static void main(String[] args) {

invoker();
}
}
为什么说“父类方法的输入参数是HashMap类型,子类的输入参数是Map类型,也就是说子类的输入参数类型的范围扩大了,子类代替父类传递到调用者中,子类的方法永远都不会被执行”?
难道不是子类继承了父类的public Collection doSomething(HashMap map)进而使invoker调用时只能调用到父类的函数,如果是Map map = new Map();
f.doSomething(map);那么就应该可以调用子类的public Collection doSomething(Map map);不然重载就没什么意义了,是不是呢?谢谢!
...全文
234 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
繁华终归落尽 2017-11-16
  • 打赏
  • 举报
回复
你明明重载了doSomething,入参为HashMap,怎么叫没有匹配的重载函数呢?

HashMap hashmap = new HashMap();
Map map = new HashMap();
f.doSomething(hashmap);
f.doSomething(map);
//子类被执行...
//父类被执行...
flowerzhouyan 2017-11-15
  • 打赏
  • 举报
回复
所以理解不了。而且后面还有个例子: public class Father { public Collection doSomething(Map map){ System.out.println("父类被执行..."); return map.values(); } } public class Son extends Father { //放大输入参数类型 public Collection doSomething(HashMap map){ System.out.println("子类被执行..."); return map.values(); } } public class Client { public static void invoker(){ //父类存在的地方,子类就应该能够存在 Son f =new Son(); HashMap map = new HashMap(); f.doSomething(map); } public static void main(String[] args) { invoker(); } } 结果:子类被执行.. 我感觉应该执行不出结果吧。没有匹配的重载函数呀!
flowerzhouyan 2017-11-15
  • 打赏
  • 举报
回复
设计模式之禅里说的
李德胜1995 2017-11-15
  • 打赏
  • 举报
回复
为什么说“父类方法的输入参数是HashMap类型,子类的输入参数是Map类型,也就是说子类的输入参数类型的范围扩大了,子类代替父类传递到调用者中,子类的方法永远都不会被执行”?.../....啥意思??谁说的???

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧