【问题标题】:No peek() method in LinkedList class? [duplicate]LinkedList 类中没有 peek() 方法? [复制]
【发布时间】:2015-12-26 14:34:50
【问题描述】:
LinkedList<String> queue = new LinkedList<String>(); // queue.peek()
Queue<String> queue2 = new LinkedList<String>();// queue2.peek()
List<String> queue3 = new LinkedList<String>(); // queue3.peek() error!

我以三种不同的方式声明了链接列表类。我知道linkedlist类是队列和列表接口的实现,但是当我以第三种方式声明并想在eclipse中使用peek()方法时,为什么会报错?他们都是同一个班级?

【问题讨论】:

  • 您正试图在 List 类型的变量上调用 peek。编译器不在乎它是否引用 LinkedList

标签: java list linked-list declaration


【解决方案1】:

是的,LinkedList 类中有一个 peek 方法。

peek() method 在 LinkedList 类中可用。由于您使用的是 List 类型的引用并且 List 接口没有方法 peek(),因此编译器不会允许您调用它。

在前两个示例中,您使用了LinkedListQueue 类型的引用,因此您可以调用peek() 方法。

Why would you declare an Interface and then instantiate an object with it in Java?

【讨论】:

  • 那么用不同的类声明相同的引用(接口)有什么区别?他们都有相同的方法?
  • 查看我添加的链接..我希望它有助于理解我们为什么使用接口作为参考。
  • 以清晰、简洁的方式解释问题,并提供相关信息的链接。 +1。我添加了一个答案,用一个类比解释了这个问题,并为任何感兴趣的人提供了一个在维护接口实现的同时使用该方法的示例。
【解决方案2】:

您不能从抽象接口的实例调用特定于具体类的方法来它。

LinkedList 类和List 接口之间的关系就像Cat 类和Animal 接口之间的关系:

Animal 的实例可以调用像.breathe().reproduce() 这样的方法,并且在方法本身保持不变的情况下以不同的方式响应对这些方法的调用(这就是接口存在的目的),但接口不应该有.sharpenClaws() 方法,因为并非所有动物都有爪子。

此时如果要调用.sharpenClaws()方法,需要先问“但是,这是什么动物?”


所以,就像您对Cat.sharpenClaws() 方法(伪代码)一样...

if (animal is Cat) {
  //remove ambiguity by defining that the (animal) is a (Cat)
  Cat thisCat = (Cat)animal;
  //make the cat sharpen it's claws
  thisCat.sharpenClaws();
}

...要使用LinkedList.peek() 方法,您需要将其转换回更具体的类:

if (aList instanceof LinkedList) {
  ((LinkedList)aList).peek();
}

【讨论】:

    【解决方案3】:

    您将 LinkedList 声明为 List 对象。 List 接口不提供peek() 方法。 这就是为什么你不能使用它。 看这里ref

    【讨论】:

    • 请解释反对意见..
    • 我没有投反对票,但我想这是因为您的答案没有添加其他人没有的任何内容,而只是在问题中抛出指向 Javadoc 的 List 链接可能无济于事提出问题的人。
    • 我也不知道为什么要投反对票。
    • 可能是因为它只是解释了“what”,而没有真正解释“why”,即便如此,它也是一个粗略的解释。
    【解决方案4】:

    java.util.List 没有窥视方法。当您使用 LinkedList&lt;String&gt; 创建列表时,java 在内部将其转换为 List&lt;String&gt;,因此您的 peek 方法会丢失。

    您创建的三个对象相同,因为它们被转换为不同的类型。

    【讨论】:

    • 方法没有丢失。只是不能直接从接口实例调用。
    • 另外,“当您使用 LinkedList 创建列表时,java 在内部将其转换为 List,因此您的 peek 方法会丢失。” 是一种非常误导的措辞方式来表达你想说的话。 Java 不是 “内部转换” 任何东西。该代码使用List varName = //... 显式执行“casting”
    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多