将Java中的变量初始化为不同类的实例,但初始化关键字相同



我是Java的新手,我终于面对了一个拖延了很长时间的问题。

我在Java中学习LinkedLists,有以下困惑,请检查:

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class LinkedListDemo {
public static void main(String[] args) {
List<Integer> myList = new LinkedList<Integer>();
myList.add(1);
myList.add(22);
myList.add(42);
Iterator it = myList.iterator();
while(it.hasNext()){
if((int)(it.next()) == 42)
System.out.println("We found 42");
}
myList.remove();
System.out.println(myList);
}
}

这里myList.remove ();无法解析方法'remove'.">

但是,如果我像这样实例化myList变量
LinkedList<Integer> myList = new LinkedList<Integer>();

我没有同样的错误,我的代码编译成功。

我只想知道这背后的工作原理。有时我用

来声明数组列表变量
List myList = new ArrayList<>();

我应该这样声明吗?

ArrayList myList = new ArrayList<>();

谢谢

将抽象与实现分离

从实现中分离抽象允许代码思考"我知道我需要这里和那里的List,但我仍然不知道/想要选择哪种List在这个时刻";或者:"我想保持我的选项开放给任何List实现在我的代码"。这是简化编码的好方法。

LinkedListArrayListList更抽象,这意味着它们是List的不同实现。通常你会更喜欢使用更抽象的类,像List在这种情况下,将抽象与实现分开,这通常是一件好事,例如,在不改变其余代码的情况下玩不同的实现。所以:

List<Integer> myCoolList = new LinkedList<Integer>()

通常比

更好(因为它促进了抽象和实现之间的分离,这对您的代码来说是一个好习惯):
LinkedList<Integer> myCoolList = new LinkedList<Integer>()

现在,如果您选择将抽象与实现分离,当然您将失去为每个实现使用特定方法的能力。但通常最通用的类(本例中为List)会提供足够的替代方法来替换丢失的方法(本例中为LinkedList.remove()方法)

通常你的remove方法应该有参数

您可以查看链接的原始代码,您可以看到它有一个不包含任何参数的remove()方法:

/**
* Retrieves and removes the head (first element) of this list.
*
* @return the head of this list
* @throws NoSuchElementException if this list is empty
* @since 1.5
*/
public E remove() {
return removeFirst();
}

然而,这个remove()方法并不存在于List类中,它是LinkedList的父类,所以当你这样声明时:

List<Integer> myList = new LinkedList<Integer>();

您将无法使用remove()方法。

但是如果你使用LinkedList初始化,那么你将能够使用它,因为remove()对LinkedList子类是唯一的。

LinkedList<Integer> myList = new LinkedList<Integer>();

List接口没有任何remove()

所以当你的编译器静态检查你的代码时,找不到一个匹配的方法。

另一方面,LinkedList拥有它。这就是为什么你的代码可以工作。

查看java文档List和LinkedList.

列表LinkedList

相关内容

最新更新