gpt4 book ai didi

Java 找不到像 addFirst 或 addLast 这样的方法

转载 作者:行者123 更新时间:2023-11-29 08:28:26 29 4
gpt4 key购买 nike

import java.util.List;
import java.util.LinkedList;
class Test {
public static void main(String[] args) {
List<String> list = new LinkedList<String>();
list.addLast("string");
list.removeLast();
}
}

当我编译代码时:

$ javac Test.java
Test.java:6: error: cannot find symbol
list.addLast("string");
^
symbol: method addLast(String)
location: variable list of type List<String>
Test.java:7: error: cannot find symbol
list.removeLast();
^
symbol: method removeLast()
location: variable list of type List<String>
2 errors

如果我实例化一个LinkedList,两边都是LinkedList,那么就不会出错。我了解到将 List 放在左侧会更好。为什么会这样?

更新#1如果变量 listList 类型,为什么下面的代码打印 true:

class Test {
public static void main(String[] args) {
List<String> list = new LinkedList<String>();
System.out.println(list instanceof LinkedList);
}
}

根据上面代码的结果,我的解释是listLinkedList的一个实例。如果是LinkedList的实例,为什么不能调用LinkedList中声明和定义的方法?

更新#2ArrayList 中有forEach 方法,List 中没有。为什么我仍然可以在 list 变量上调用 forEach 方法

List<String> list = new ArrayList<String>();

这与 lambda 表达式有关吗?

最佳答案

Why did this happen?

Java 是一种静态类型语言。这意味着编译器会查看变量的声明类型(而不是其中可能存在的对象)来决定该方法是否存在。

声明的类型 List 没有这些方法。它们已添加到 LinkedList 中(来自 Deque 接口(interface),用于“支持两端插入和删除元素的线性集合”)

I have learned that putting List on the left side is better.

是的,这叫做“接口(interface)编码”。它避免您编写仅适用于该接口(interface)的特定实现的代码,并且可以在不更新调用代码的情况下更改实现。

但它只有在界面提供您需要的一切时才有效。

在您的情况下,您想要使用 addLast,它不是通用 List 接口(interface)的一部分。所以你必须使用Deque提供的接口(interface)(或者直接使用 LinkedList)。

There is forEach method in ArrayList but not in List.

forEachIterable 定义这是所有这些东西的 super 接口(interface)。因此,它也可以在 List 中使用。

If it's an instance of LinkedList, why can't it call methods declared and defined in LinkedList?

再次:静态类型。变量内部的实际运行时实例很可能是比声明的变量更具体的类型。但是编译器编译时只能做静态分析,即查看源代码和方法、字段和变量的声明类型,而不是程序执行期间发生的任何事情。

关于Java 找不到像 addFirst 或 addLast 这样的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50382821/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com