我总是在我们声明我们应该做的集合时学习Interface ob = new Class()
,如果我想使用例如LinkedList我会做List ob = new LinkedList()
,但是我无法访问所有来自LinkedList的方法.. LinkedList ob = new LinkedList()
100%是否正确?
答案 0 :(得分:11)
不是LinkedList ob = new LinkedList()100%正确吗?
我建议使用通用表单,但是确定 - 如果你想使用特定到LinkedList
的功能,你需要相应地声明变量。
您可能想要检查Deque<E>
或Queue<E>
接口是否具有您想要的功能。如果他们这样做,请使用那些与描述您需要的内容相符的内容,而不是您将使用的实现。
答案 1 :(得分:6)
是,
LinkedList<...> items = new LinkedList<...>();
如果您知道items
将取决于LinkedList<T>
界面中未捕获的List<T>
方法,则完全正确。
答案 2 :(得分:4)
您应该始终尝试将声明保持在最高级别可能,这意味着您应该停留在提供所需功能的最高级别:如果List
方法是不够,你对LinkedList
声明完全没问题。
答案 3 :(得分:3)
规则“始终代码接口”必须具有一定的灵活性。你的建议是好的,当你得出结论时,唯一的选择。
作为旁注,对大多数JVM来说,编写像这样的具体类更快。决定表现是否值得违反规则是很难决定的。
答案 4 :(得分:3)
如果您确实需要使用List接口上没有的方法,那么使用LinkedList的API肯定没有问题。对List接口进行编程的一般规则认识到:1)很少需要这些方法,2)在大多数人的经验中,我更有可能发现我需要对列表进行排序和/或使用大量随机访问,并决定切换到ArrayList,而不是我需要的方法之一,只有LinkedList具有。
如果您发现List没有为您提供所需内容,也可能是您正在编程到Queue界面。
答案 5 :(得分:2)
LinkedList是通用的。你应该这样做:
LinkedList<String> linkedList = new LinkedList<String>();
(或者你需要在那里存储的任何其他东西而不是String)
答案 6 :(得分:1)
不完全正确100%。
声明任何集合的首选方法是包含它所持有的数据类型。因此,对于您的示例,它是LinkedList<Integer> ob = new LinkedList<Integer>();
。
答案 7 :(得分:1)
没有..这是错误的,如果他想将他的实现从链表更改为列表类型的任何其他实现,他将会出错...这样做是错误的...所以最好使用接口级别声明。
答案 8 :(得分:0)
我不会总是建议你使用泛型...... 因为有时您可能需要将不同的对象包装在这里....
String str="a string";
boolean status=false;
LinkedList ll = new LinkedList();
ll.add(str);
ll.add(status);
在某些情况下,例如RMI的情况,你只能发送序列化数据.....并假设你想发送一个类对象(这是非序列化的).......在那里你可以包装成员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......
答案 9 :(得分:0)
你仍然可以使用List访问LinkedList方法,你所要做的就是输入cast 例如
((LinkedList)ob).add()
使用通用List而不是LinkedList是因为如果你只是改变你正在使用的列表类型(比如说双链表)你的程序仍然可以工作Generics是为了简化你的代码以便更轻松和更多“可改变”
答案 10 :(得分:-2)
实际上,如果将它们作为原始类型进行参数化会更好。