我总是知道,当我们声明一个我们应该做的集合Interface ob = new Class()
时,如果我想使用例如LinkedList,我会做List ob = new LinkedList()
,但我不能访问LinkedList中的所有方法。。LinkedList ob = new LinkedList()
不是100%正确吗?
LinkedList ob=new LinkedList()不是100%正确吗?
好吧,我建议使用泛型形式,但可以肯定的是,如果你想使用LinkedList
特定于的功能,你需要相应地声明变量。
不过,您可能需要检查Deque<E>
或Queue<E>
接口是否符合您的要求。如果他们这样做了,那么就按照描述你需要什么而不是你将使用什么实现的想法来使用它们。
是,
LinkedList<...> items = new LinkedList<...>();
如果您知道items
将依赖于LinkedList<T>
中未在List<T>
接口中捕获的方法,则完全正确。
您应该始终尝试将声明保持在尽可能高的级别,这意味着您应该停止在提供所需所有功能的最高级别:如果List
方法还不够,那么您完全可以使用LinkedList
声明。
如果您确实需要使用不在List接口上的方法,那么使用LinkedList的API肯定没有问题。List接口编程的一般规则认识到,1)很少需要这些方法,2)根据大多数人的经验,我发现我需要对列表进行排序和/或使用大量随机访问,并决定切换到ArrayList,这比我需要LinkedList仅有的一个方法要容易得多。
如果您发现List不能满足您的需要,也可能是您正在对Queue接口进行编程。
规则"总是对接口进行编码";必须采取一定的灵活性。你的建议很好,正如你得出的结论,这是唯一的选择。
顺便说一句,大多数JVM都能更快地将代码编码到像这样的具体类中。决定表演是否值得打破规则是一件很难决定的事情。
LinkedList是一个泛型。你应该做:
LinkedList<String> linkedList = new LinkedList<String>();
(或者您需要存储在其中而不是字符串中的任何其他内容)
并非100%正确。
声明任何集合的首选方法是包含它所持有的数据类型。所以,以你的例子来说,它应该是LinkedList<Integer> ob = new LinkedList<Integer>();
。
没有。。这是错误的,在后期阶段,如果他想将他的实施从链表更改为任何其他列表类型的实施,他会出错。。。所以最好使用接口级声明。
我不会总是建议您使用泛型。。。。。因为有时你可能需要包装不同的对象,就像这里。。。。
String str="a string";
boolean status=false;
LinkedList ll = new LinkedList();
ll.add(str);
ll.add(status);
在某些情况下,比如RMI,u只能发送序列化的数据。。。。。并且假设您想要发送一个类对象(未序列化)。。。。。。。在那里,您可以将类的成员(基元)包装在LinkedList中,并将该对象作为一个整体传递。。。。。。。不用担心大量的争论。。。。。。例如:
public Class DataHouse
{
public int a;
public String str;
.
.
.
}
现在,在某个地方,你需要传递对象。。。。您可以执行以下操作。。。。
DataHouse dh =new DataHouse();
LinkedList ll = new LinkedList();
ll.add(dh.a);
ll.add(dh.str);
// Now the content is serialized and can pass it as a capsuled data......
您仍然可以使用List访问LinkedList方法,您所要做的就是键入cast例如
((LinkedList)ob).add()
使用泛型列表而不是LinkedList的意义在于,如果你只是简单地更改你正在使用的列表类型(比如说双链表),你的程序仍然可以工作泛型是为了简化你的代码,使其更具可移植性和"可更改性"
实际上,如果将其参数化会更好,因为两者都是原始类型。