2012-08-29 37 views
2

鑑於這種List<Employee>使用泛型時,List如何在內部檢查方法調用的類型?

List <Employee> empList=new ArrayList<Employee>(); 

,當我試圖添加Student

l.add(0,new Student(1,2,3)); 

如何列表解決了這個,給我編譯錯誤?

+1

什麼是錯誤?你能提供一段代碼來重現問題嗎? – Vulcan

+3

只有編譯器可以給你編譯錯誤。 –

+0

我知道它的愚蠢,但是學生是實施還是延伸員工? – user902383

回答

0
List<Employee> empList = new ArrayList<Employee>() 

在上述情況下,由於您已指定您的empList只包含Employee的實例。

如果您嘗試添加任何非Employee或從其派生的其他實例類型,則編譯器有責任投訴。這是因爲,您已經爲編譯器提供了足夠的信息,以便在編譯期間決定允許將哪些類型的實例添加到此列表中。因此,編譯器知道add()方法將總是期望/或來自Employee而不是Student的實例。因此,在你的情況下的錯誤。

使用泛型的另一個有趣的結果是,當您嘗試從此列表中選擇一個元素時get()。當時的編譯器也知道你試圖從列表中獲得的元素需要是Employee類。因此,如果您執行非法演員(例如將從get()返回的對象投射到Student),編譯器會再次發出抱怨。

以下文章可能是幫助理解這一概念:

+1

是的,我的問題是,編譯器如何檢查它是Employee類型的,它是學生類型 – user1632316

+0

對於downvoter:小心解釋? – Sujay

+0

@Sujay:問題不在於如何更正代碼,而是* how *'List'實際檢測到問題。 –

5

其實它不是專執行檢查的List,它是編譯器(正如你暗示的那樣)。

List簡單地提供兩條信息:

  • 有一種類型E與該類型List被參數化:

    public interface List<E> extends Collection<E> 
    
  • add接受E類型的對象的方法:

如果你建立一個List<Employee>然後編譯器知道,你可以不與任何調用add除了Employee,如果你嘗試會給一個編譯錯誤。

還應該注意的是在運行時沒有這樣的檢查!因此,如果你以某種方式設法「通過」編譯器進行的檢查(例如使用a raw type),那麼你可以對List執行各種錯誤的操作,並且運行時不會檢測到問題(直到您嘗試以非通用方式訪問「錯誤」類型)。

+1

如果您想運行時檢查,請使用:http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#checkedCollection(java。 util.Collection,java.lang.Class) –

+0

你是對的,它是在'編譯'階段 – meadlai

相關問題