A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kira 中级黑马   /  2014-3-11 16:58  /  815 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 kira 于 2014-3-11 17:02 编辑

张孝祥老师曾近说过 同样的写法 你写成面向父类 人家就觉得你很专业
比如 List<String> li = new ArrayList<String>();
但是 今天恰逢回归集合的盲点LinkedList的时候 发现有点不一样 比如说
我new 一个LinkedList 然后添加几个元素 最后用1.6的新方法 offerFrist结果确报了错
但是如果老老实实的写LinkedList <String> li = new LinkedList<String>();
发现这方法又能用了 那这样岂不是说我们new出来的对象只是个list而不是他的子类么 这与代码也互相矛盾 这是为什么:(
下面是上述思想所写的简单的测试代码
  1. import java.util.LinkedList;
  2. import java.util.List;




  3. public class LinkDemo {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) {
  8.                 // TODO Auto-generated method stub
  9.                 List<String> link  =new   LinkedList<String>();
  10. link.add("aaa");
  11. link.add("bbb");
  12. link.add("ccc");
  13. link.offerFirst("sss");//这里就提示报错
  14.         }

  15. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

3 个回复

倒序浏览
首先offerFirst是LinkedList特有的方法,在LinkedList的顶层接口List中是没有这个方法的。
offerFirst会出错是因为你用List的引用指向了LinkedList的实例对象,父类引用指向子类对象会缺失子类特有的一些内容的。
如果你要用的是LinkedList特有的方法,就不要用这话方法了。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
房建斌 发表于 2014-3-11 17:03
首先offerFirst是LinkedList特有的方法,在LinkedList的顶层接口List中是没有这个方法的。
offerFirst会出 ...

但是这样一来就不符合多态的思想了啊 你比如说 我想要一个动物 你给我一个鸡
这没有问题 那么我拿到了鸡的引用就可以调用鸡的方法对吧 但是
现在这个例子就完全否认了这一观点 就变成了 我想得到鸡的特有方法 就只能找到鸡 而不是找到鸡的引用
:(
回复 使用道具 举报
List是继续自collect接口的有序集合,List可以根据元素索引进行取得、删除、插入操作。 LinkedList实现了List接口,LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。 “List<String> link  =new   LinkedList<String>();"把创建LinkList的对象赋给接口变量List型的接口变量link。  ”link.add("ccc");“语句是接口回调添加对象”ccc“。然而语句”link.offerFirst("sss");“接口回调link.offerFirst(),但link.offerFirst();只是LinstLink类的特有方法,而在List型对象没有link.offerFirst();方法。故接口回调会报错!

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马