[英]Initializing variables in Java as instances of different classes but same initializing keyword
我是 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>();
我没有同样的错误,我的代码编译成功。
我只想知道这背后的工作。 我的意思是有时我声明 ArrayList 变量
List myList = new ArrayList<>();
我应该这样声明吗?
ArrayList myList = new ArrayList<>();
谢谢你
从实现中分离抽象允许在“我知道我需要在这里和那里一个List
,但我现在仍然不知道/想要选择哪种List
”或“我想保留我的选项对我的代码中的任何List
实现开放”。 这是简化编码的好方法。
LinkedList
和ArrayList
没有List
抽象,这意味着它们是List
的不同实现。 通常你会更喜欢使用更多的抽象类,比如在这种情况下的List
,将抽象与实现分开,这通常是一件好事,例如在不改变代码的 rest 的情况下使用不同的实现。 所以:
List<Integer> myCoolList = new LinkedList<Integer>()
通常比:
LinkedList<Integer> myCoolList = new LinkedList<Integer>()
现在,如果您选择将抽象与实现分开,当然您将失去使用特定于每个实现的方法的能力。 但通常最通用的 class (在本例中为List
)将提供足够的替代方法来替换丢失的方法(在本例中为LinkedList.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()方法在LinkedList的父class的List class中是不存在的,所以这样声明的时候:
List<Integer> myList = new LinkedList<Integer>();
您将无法使用 remove() 方法。
但是如果你使用 LinkedList 初始化,那么你将能够使用它,因为 remove() 对于子类 LinkedList 是唯一的。
LinkedList<Integer> myList = new LinkedList<Integer>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.