有什么区别
LinkedList<String> l1 = new LinkedList<String>();
List<String> l2 = new LinkedList<String>();
为什么l2
类型没有方法addFirst
l1
类型有方法addFirst
吗?即使它们都是
持有LinkedList
个对象?
与我从Gosling的“Java编程语言”中读到的内容相反
这表明对象将是你的目标,
在这种情况下,尽管如此,我还是LinkedList
new LinkedList()
它是List
我应该如何恰当地宣布呢?
Collection<String> c = new LinkedList<String>();
List<String> c = new LinkedList<String>();
LinkedList<String> c = new LinkedList<String>();
答案 0 :(得分:8)
为什么l2类型没有方法addFirst而l1类型有方法addFirst?
因为l2
的编译时类型仅为List<E>
,而List<E>
未声明addFirst
方法。
作为一个更简单的例子,请考虑:
Object x = "hello";
int invalid = x.length(); // This is invalid
在执行时,x
会引用String
个对象,但变量本身的类型只是Object
,因此您无法调用String.length()
方法
在此区分三个不同的术语非常重要:
变量的值(假设它不是原始变量)是一个参考。该引用可以是null
,也可以引用与变量类型赋值兼容的类型的对象。
所以在上面的例子中:
x
的类型为Object
x
的值是参考答案 1 :(得分:1)
LinkedList<String> l1 = new LinkedList<String>();
这里l1是LinkedList的实例
List<String> l2 = new LinkedList<String>();
这里l2是List
的实例l2没有方法addFirst,因为当LinkedList包含该方法时,List接口不包含该方法。但是在代码中,您可以将l2转换为linkedList并调用addFirst()方法。
答案 2 :(得分:0)
列表l2 = new LinkedList();
当您拥有仅采用SuperClass
实例的方法时,这非常有用。由于SubClass
是 SuperClass
,您可以使用SubClass
的实例并将其视为SuperClass
。
那是多态性。它允许您在不破坏代码的其余部分的情况下更改类内部的实现。