list接口的likedlist容器类找不到方法

帅气好男人_Jack 2014-06-24 11:40:34
我用list接口构造了linkedlist的容器类,构造一个链表,调用linkedlist的getFirst()和 remove()方法,变异竟然提示找不到该方法,我仔细查找了java技术文档,上面明明有啊,但是变异还是说找不到该方法。是不是我的jdk版本过时了,我的jdk是1.6版本的,下面是代码和调试结果:
import java.util.*;

public class TestLinkedList
{
public static void main(String[] args)
{
List L = new LinkedList();
for(int i=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"));
}
}

...全文
191 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 9 楼 shine333 的回复:
你现在还没到运行时,现在是语法错误。 List接口没有提供first, last系列方法。所以,你声明的类型(也就是等号左边的类型)不能是List,而只能是LinkedList 反过来,你提到的运行时: 假设:
public class MyLinkedList extends LinkedList {
   public Object removeLast() {
      System.out.println("不可以删除最后一个!!!");
      return null;
   }
}
这个时候,随便你声明具体的类,还是LinkedList

LinkedList list = new MyLinkedList();
list.add("1234");
list.add("5678");
list.removeLast();
编译都能通过,且在运行时,会执行你所谓的“动态绑定”。 再把我的例子复述一遍: 今天(编译期,对应javac命令执行的时间),当我(代码)对你(编译器对应javac命令)说:“明天,有个人(List)要来”,你(编译器)只知道他是个人(List)——插一句,编译器还没智能到能够分析代码,这个即没必要,也不可靠,所以,即使就在等号后面马上出现了真实类型。 如果这个时候(还是编译期),我(代码)对你(编译器)说:“你带这个人(List)去男厕所(执行removeLast方法)”,你(编译器)会傻傻地拒绝(编译错误),说:“我不知道他是不是个男人(LinkedList),不能让这个人(List)去做只有男人(LinkedList)才能做的事情”。 这个时候(编译期),我(代码)只能改口(改掉你错误代码)说:“明天,有个男人(声明类型,也就是等号左边那个类型)要来,你带他去男厕所(执行removeLast)”。这个时候,你(编译器)会很高兴的确认我给你的任务(编译通过) 到了第二天(运行期,对应java命令执行的时间),那个人来了,检查无误,果然是个男人,而且还是个帅哥(男人的子类,好比上面MyLinkedList)。反正不管是帅哥也好,糟老头(其他LinkedList子类)也罢,反正一定是个男人,一定能去男厕所(执行在在LinkedList中定义过的removeLast方法)。
了解!我吧动态绑定搞错啦,动态绑定只针对重写的方法
shine333 2014-06-24
  • 打赏
  • 举报
回复
你现在的声明类型是List而不是LinkedList,即使它真实的类型是LinkedList,你仍然没法用LInkedList里面才有的方法。 好比,我现在说:“明天会有个人过来”,即使来的人确实是个“男的Java程序员”,你在仅仅知道“人”的情况下,没法做出以下任何一个结论: 他可以去男厕所 可以让他写Java程序 ... 只有在我明确告诉你“明天会有个男的Java程序员过来”,你才能得出上述的结论。 同样,你也只有明确告诉编译器,你的对象的类型是LinkedList,编译器才能让你用LinkedList的方法。如果你仅仅告诉编译器,它是个List(哪怕实际类型确实是LinkedList),编译器也不会让你用仅在LinkedList里面定义的方法
secret32 2014-06-24
  • 打赏
  • 举报
回复
getFirst removeLast是Linkedlist的方法 而不是List的方法 所以会找不到
ps 都用上Linkedlist了 就用个IDE吧 别用记事本了
shine333 2014-06-24
  • 打赏
  • 举报
回复
然后,漏了楼主的“动态绑定”,也就是多态: 进了男厕所,不同的男人(不同子类)有不同的表现,有的唱歌,有的有前列腺,因而慢腾腾,还有小孩子的直接拉在了裤子上(抛exception)。具体怎么样的表现,现在(编译期)你没法知道,只有到明天,进了男厕所(运行期)才知道
shine333 2014-06-24
  • 打赏
  • 举报
回复
你现在还没到运行时,现在是语法错误。 List接口没有提供first, last系列方法。所以,你声明的类型(也就是等号左边的类型)不能是List,而只能是LinkedList 反过来,你提到的运行时: 假设:
public class MyLinkedList extends LinkedList {
   public Object removeLast() {
      System.out.println("不可以删除最后一个!!!");
      return null;
   }
}
这个时候,随便你声明具体的类,还是LinkedList

LinkedList list = new MyLinkedList();
list.add("1234");
list.add("5678");
list.removeLast();
编译都能通过,且在运行时,会执行你所谓的“动态绑定”。 再把我的例子复述一遍: 今天(编译期,对应javac命令执行的时间),当我(代码)对你(编译器对应javac命令)说:“明天,有个人(List)要来”,你(编译器)只知道他是个人(List)——插一句,编译器还没智能到能够分析代码,这个即没必要,也不可靠,所以,即使就在等号后面马上出现了真实类型。 如果这个时候(还是编译期),我(代码)对你(编译器)说:“你带这个人(List)去男厕所(执行removeLast方法)”,你(编译器)会傻傻地拒绝(编译错误),说:“我不知道他是不是个男人(LinkedList),不能让这个人(List)去做只有男人(LinkedList)才能做的事情”。 这个时候(编译期),我(代码)只能改口(改掉你错误代码)说:“明天,有个男人(声明类型,也就是等号左边那个类型)要来,你带他去男厕所(执行removeLast)”。这个时候,你(编译器)会很高兴的确认我给你的任务(编译通过) 到了第二天(运行期,对应java命令执行的时间),那个人来了,检查无误,果然是个男人,而且还是个帅哥(男人的子类,好比上面MyLinkedList)。反正不管是帅哥也好,糟老头(其他LinkedList子类)也罢,反正一定是个男人,一定能去男厕所(执行在在LinkedList中定义过的removeLast方法)。
  • 打赏
  • 举报
回复
引用 2 楼 shine333 的回复:
你现在的声明类型是List而不是LinkedList,即使它真实的类型是LinkedList,你仍然没法用LInkedList里面才有的方法。 好比,我现在说:“明天会有个人过来”,即使来的人确实是个“男的Java程序员”,你在仅仅知道“人”的情况下,没法做出以下任何一个结论: 他可以去男厕所 可以让他写Java程序 ... 只有在我明确告诉你“明天会有个男的Java程序员过来”,你才能得出上述的结论。 同样,你也只有明确告诉编译器,你的对象的类型是LinkedList,编译器才能让你用LinkedList的方法。如果你仅仅告诉编译器,它是个List(哪怕实际类型确实是LinkedList),编译器也不会让你用仅在LinkedList里面定义的方法
Java的接口不是支持动态绑定的吗?父类引用指向子类,运行时更具实际的对象调用对象自己的方法
shine333 2014-06-24
  • 打赏
  • 举报
回复
引用 5 楼 jackzhouyu 的回复:
[quote=引用 1 楼 secret32 的回复:] getFirst removeLast是Linkedlist的方法 而不是List的方法 所以会找不到 ps 都用上Linkedlist了 就用个IDE吧 别用记事本了
Java的接口不是支持动态绑定吗?LinkedList集成List吗?[/quote] 你还是没看懂我举的例子。
  • 打赏
  • 举报
回复
引用 楼主 jackzhouyu 的回复:
我用list接口构造了linkedlist的容器类,构造一个链表,调用linkedlist的getFirst()和 remove()方法,变异竟然提示找不到该方法,我仔细查找了java技术文档,上面明明有啊,但是变异还是说找不到该方法。是不是我的jdk版本过时了,我的jdk是1.6版本的,下面是代码和调试结果:
import java.util.*;

public class TestLinkedList
{
	public static void main(String[] args)
	{
		List L = new LinkedList();
		for(int i=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的动态绑定不就是这个么,难道不行
  • 打赏
  • 举报
回复
引用 1 楼 secret32 的回复:
getFirst removeLast是Linkedlist的方法 而不是List的方法 所以会找不到 ps 都用上Linkedlist了 就用个IDE吧 别用记事本了
Java的接口不是支持动态绑定吗?LinkedList集成List吗?
逍遥jc 2014-06-24
  • 打赏
  • 举报
回复
如果没有其它方面的约束的话。直接改为LinkedList L = new LinkedList();就好了。
Eternal_M 2014-06-24
  • 打赏
  • 举报
回复
List L = new LinkedList(); 改为 LinkedList L = new LinkedList();

62,614

社区成员

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

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