超类类型或子类类型

时间:2013-07-08 10:37:47

标签: java list collections linked-list

有什么区别
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>();

3 个答案:

答案 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 :(得分: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

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