超类类型或子类类型

kra*_*ato 1 java collections linked-list list

有什么区别

LinkedList<String> l1 = new LinkedList<String>();
List<String> l2 = new LinkedList<String>();
Run Code Online (Sandbox Code Playgroud)

为什么l2类型没有方法addFirstl1类型有方法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>();
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

为什么l2类型没有方法addFirst而l1类型有方法addFirst?

因为编译时类型l2只是List<E>,并List<E>没有声明addFirst方法.

作为一个更简单的例子,考虑:

Object x = "hello";
int invalid = x.length(); // This is invalid
Run Code Online (Sandbox Code Playgroud)

在执行时,x会引用一个String对象,但变量本身的类型只是Object,所以你不能调用该String.length()方法.

在此区分三个不同的术语非常重要:

  • 一个变量,其类型基于它的声明方式
  • 参考(例如引用类型变量的值)
  • 一个对象(有一个类型)

变量的值(假设它不是原始变量)是一个参考.该引用可以是null,或者它可以引用与变量类型分配兼容的类型的对象.

所以在上面的例子中:

  • 类型xObject
  • x是参考
  • 该引用指的是String执行时类型的对象