问题描述
我用list接口构造了linkedlist的容器类,构造一个链表,调用linkedlist的getFirst()和remove()方法,变异竟然提示找不到该方法,我仔细查找了java技术文档,上面明明有啊,但是变异还是说找不到该方法。是不是我的jdk版本过时了,我的jdk是1.6版本的,下面是代码和调试结果:importjava.util.*;publicclassTestLinkedList{publicstaticvoidmain(String[]args){ListL=newLinkedList();for(inti=0;i<9;i++)L.add("周"+i);System.out.println(L);System.out.println(L.getFirst());//获取list头元素System.out.println(L.indexOf("周1"));L.add(7,"周100");L.removeLast();//删除最后一个元素System.out.println(L);Collections.shuffle(L);System.out.println(L);Collections.sort(L);System.out.println(L);System.out.println(Collections.binarySearch(L,"周100"));}}
解决方案
解决方案二:
getFirstremoveLast是Linkedlist的方法而不是List的方法所以会找不到ps都用上Linkedlist了就用个IDE吧别用记事本了
解决方案三:
你现在的声明类型是List而不是LinkedList,即使它真实的类型是LinkedList,你仍然没法用LInkedList里面才有的方法。好比,我现在说:“明天会有个人过来”,即使来的人确实是个“男的Java程序员”,你在仅仅知道“人”的情况下,没法做出以下任何一个结论:他可以去男厕所可以让他写Java程序...只有在我明确告诉你“明天会有个男的Java程序员过来”,你才能得出上述的结论。同样,你也只有明确告诉编译器,你的对象的类型是LinkedList,编译器才能让你用LinkedList的方法。如果你仅仅告诉编译器,它是个List(哪怕实际类型确实是LinkedList),编译器也不会让你用仅在LinkedList里面定义的方法
解决方案四:
ListL=newLinkedList();改为LinkedListL=newLinkedList();
解决方案五:
如果没有其它方面的约束的话。直接改为LinkedListL=newLinkedList();就好了。
解决方案六:
引用1楼secret32的回复:
getFirstremoveLast是Linkedlist的方法而不是List的方法所以会找不到ps都用上Linkedlist了就用个IDE吧别用记事本了
Java的接口不是支持动态绑定吗?LinkedList集成List吗?
解决方案七:
引用楼主jackzhouyu的回复:
我用list接口构造了linkedlist的容器类,构造一个链表,调用linkedlist的getFirst()和remove()方法,变异竟然提示找不到该方法,我仔细查找了java技术文档,上面明明有啊,但是变异还是说找不到该方法。是不是我的jdk版本过时了,我的jdk是1.6版本的,下面是代码和调试结果:importjava.util.*;publicclassTestLinkedList{publicstaticvoidmain(String[]args){ListL=newLinkedList();for(inti=0;i<9;i++)L.add("周"+i);System.out.println(L);System.out.println(L.getFirst());//获取list头元素System.out.println(L.indexOf("周1"));L.add(7,"周100");L.removeLast();//删除最后一个元素System.out.println(L);Collections.shuffle(L);System.out.println(L);Collections.sort(L);System.out.println(L);System.out.println(Collections.binarySearch(L,"周100"));}}
Java的动态绑定不就是这个么,难道不行
解决方案八:
引用5楼jackzhouyu的回复:
Quote: 引用1楼secret32的回复:
getFirstremoveLast是Linkedlist的方法而不是List的方法所以会找不到ps都用上Linkedlist了就用个IDE吧别用记事本了Java的接口不是支持动态绑定吗?LinkedList集成List吗?
你还是没看懂我举的例子。
解决方案九:
引用2楼shine333的回复:
你现在的声明类型是List而不是LinkedList,即使它真实的类型是LinkedList,你仍然没法用LInkedList里面才有的方法。好比,我现在说:“明天会有个人过来”,即使来的人确实是个“男的Java程序员”,你在仅仅知道“人”的情况下,没法做出以下任何一个结论:他可以去男厕所可以让他写Java程序...只有在我明确告诉你“明天会有个男的Java程序员过来”,你才能得出上述的结论。同样,你也只有明确告诉编译器,你的对象的类型是LinkedList,编译器才能让你用LinkedList的方法。如果你仅仅告诉编译器,它是个List(哪怕实际类型确实是LinkedList),编译器也不会让你用仅在LinkedList里面定义的方法
Java的接口不是支持动态绑定的吗?父类引用指向子类,运行时更具实际的对象调用对象自己的方法
解决方案十:
你现在还没到运行时,现在是语法错误。List接口没有提供first,last系列方法。所以,你声明的类型(也就是等号左边的类型)不能是List,而只能是LinkedList反过来,你提到的运行时:假设:publicclassMyLinkedListextendsLinkedList{publicObjectremoveLast(){System.out.println("不可以删除最后一个!!!");returnnull;}}
这个时候,随便你声明具体的类,还是LinkedListLinkedListlist=newMyLinkedList();list.add("1234");list.add("5678");list.removeLast();
编译都能通过,且在运行时,会执行你所谓的“动态绑定”。再把我的例子复述一遍:今天(编译期,对应javac命令执行的时间),当我(代码)对你(编译器对应javac命令)说:“明天,有个人(List)要来”,你(编译器)只知道他是个人(List)——插一句,编译器还没智能到能够分析代码,这个即没必要,也不可靠,所以,即使就在等号后面马上出现了真实类型。如果这个时候(还是编译期),我(代码)对你(编译器)说:“你带这个人(List)去男厕所(执行removeLast方法)”,你(编译器)会傻傻地拒绝(编译错误),说:“我不知道他是不是个男人(LinkedList),不能让这个人(List)去做只有男人(LinkedList)才能做的事情”。这个时候(编译期),我(代码)只能改口(改掉你错误代码)说:“明天,有个男人(声明类型,也就是等号左边那个类型)要来,你带他去男厕所(执行removeLast)”。这个时候,你(编译器)会很高兴的确认我给你的任务(编译通过)到了第二天(运行期,对应java命令执行的时间),那个人来了,检查无误,果然是个男人,而且还是个帅哥(男人的子类,好比上面MyLinkedList)。反正不管是帅哥也好,糟老头(其他LinkedList子类)也罢,反正一定是个男人,一定能去男厕所(执行在在LinkedList中定义过的removeLast方法)。
解决方案十一:
然后,漏了楼主的“动态绑定”,也就是多态:进了男厕所,不同的男人(不同子类)有不同的表现,有的唱歌,有的有前列腺,因而慢腾腾,还有小孩子的直接拉在了裤子上(抛exception)。具体怎么样的表现,现在(编译期)你没法知道,只有到明天,进了男厕所(运行期)才知道
解决方案十二:
引用9楼shine333的回复:
你现在还没到运行时,现在是语法错误。List接口没有提供first,last系列方法。所以,你声明的类型(也就是等号左边的类型)不能是List,而只能是LinkedList反过来,你提到的运行时:假设:publicclassMyLinkedListextendsLinkedList{publicObjectremoveLast(){System.out.println("不可以删除最后一个!!!");returnnull;}}这个时候,随便你声明具体的类,还是LinkedListLinkedListlist=newMyLinkedList();list.add("1234");list.add("5678");list.removeLast();
编译都能通过,且在运行时,会执行你所谓的“动态绑定”。再把我的例子复述一遍:今天(编译期,对应javac命令执行的时间),当我(代码)对你(编译器对应javac命令)说:“明天,有个人(List)要来”,你(编译器)只知道他是个人(List)——插一句,编译器还没智能到能够分析代码,这个即没必要,也不可靠,所以,即使就在等号后面马上出现了真实类型。如果这个时候(还是编译期),我(代码)对你(编译器)说:“你带这个人(List)去男厕所(执行removeLast方法)”,你(编译器)会傻傻地拒绝(编译错误),说:“我不知道他是不是个男人(LinkedList),不能让这个人(List)去做只有男人(LinkedList)才能做的事情”。这个时候(编译期),我(代码)只能改口(改掉你错误代码)说:“明天,有个男人(声明类型,也就是等号左边那个类型)要来,你带他去男厕所(执行removeLast)”。这个时候,你(编译器)会很高兴的确认我给你的任务(编译通过)到了第二天(运行期,对应java命令执行的时间),那个人来了,检查无误,果然是个男人,而且还是个帅哥(男人的子类,好比上面MyLinkedList)。反正不管是帅哥也好,糟老头(其他LinkedList子类)也罢,反正一定是个男人,一定能去男厕所(执行在在LinkedList中定义过的removeLast方法)。
了解!我吧动态绑定搞错啦,动态绑定只针对重写的方法