1

有什么区别

LinkedList<String> l1 = new LinkedList<String>();
List<String> l2 = new LinkedList<String>();

为什么l2类型没有方法addFirstl1类型有方法addFirst?即使他们都持有一个LinkedList对象?与我从 Gosling 的“Java 编程语言”中读到的相反,它指出该对象将是您所做的,在这种情况下LinkedListnew LinkedList()即使它是 List 类型,我也将它设为

那我应该如何正确申报呢?

Collection<String> c = new LinkedList<String>();
List<String> c = new LinkedList<String>();
LinkedList<String> c = new LinkedList<String>();
4

3 回答 3

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,也可以引用与变量类型赋值兼容的类型的对象。

所以在上面的例子中:

  • 的类型xObject
  • 的值x是参考
  • 该引用String在执行时引用类型的对象
于 2013-07-08T10:40:11.537 回答
1
LinkedList<String> l1 = new LinkedList<String>();

这里 l1 是 LinkedList 的实例

List<String> l2 = new LinkedList<String>();

这里 l2 是 List 的实例

l2 没有方法 addFirst 因为 List 接口不包含该方法,而 LinkedList 包含该方法。但是在您的代码中的任何时候,您都可以将 l2 转换为 linkedList 并可以调用 addFirst() 方法。

于 2013-07-08T10:41:40.540 回答
0

列表 l2 = new LinkedList();

当您有一个仅采用SuperClass. 由于SubClass is a SuperClass,您可以使用 的实例SubClass并将其视为SuperClass

这就是多态性。它允许您在不破坏其余代码的情况下更改类内部的实现。

于 2013-07-08T10:51:01.510 回答