2013-07-08 50 views
1

是什麼的超類型或亞型的類型

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

的差異爲什麼l2型沒辦法addFirstl1類型有方法addFirst?儘管它們都是 持有LinkedList對象? 相反的是,我從高斯林的讀取其中指出,對象將是你在這種情況下,我與new LinkedList()即使 它的類型是List使它成爲LinkedList做什麼它是, 「Java編程語言」

我該如何正確申報?

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

回答

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類型的對象
+0

感謝您的回答!所以你的意思是......我應該始終確保編譯期間的類型應該與執行期間引用所指向的對象互補。 – krato

1
LinkedList<String> l1 = new LinkedList<String>(); 

這裏l1是實例LinkedList的

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

的下面L2是列表

L2沒有辦法addfirst僅因爲List接口不包含方法,而鏈表包含的實例。但是,無論何時,在您的代碼中,您都可以將您的l2轉換爲linkedList並調用addFirst()方法。

0

List l2 = new LinkedList();

當您只有一個只需要SuperClass實例的方法時,這很有用。由於​​SuperClass,因此您可以使用​​的實例並將其視爲SuperClass

這是多態性。它允許你在不破壞代碼的其餘部分的情況下更改類內部的實現。