鑑於這種List<Employee>
:使用泛型時,List如何在內部檢查方法調用的類型?
List <Employee> empList=new ArrayList<Employee>();
,當我試圖添加Student
:
l.add(0,new Student(1,2,3));
如何列表解決了這個,給我編譯錯誤?
鑑於這種List<Employee>
:使用泛型時,List如何在內部檢查方法調用的類型?
List <Employee> empList=new ArrayList<Employee>();
,當我試圖添加Student
:
l.add(0,new Student(1,2,3));
如何列表解決了這個,給我編譯錯誤?
List<Employee> empList = new ArrayList<Employee>()
在上述情況下,由於您已指定您的empList只包含Employee
的實例。
如果您嘗試添加任何非Employee
或從其派生的其他實例類型,則編譯器有責任投訴。這是因爲,您已經爲編譯器提供了足夠的信息,以便在編譯期間決定允許將哪些類型的實例添加到此列表中。因此,編譯器知道add()
方法將總是期望/或來自Employee
而不是Student
的實例。因此,在你的情況下的錯誤。
使用泛型的另一個有趣的結果是,當您嘗試從此列表中選擇一個元素時get()
。當時的編譯器也知道你試圖從列表中獲得的元素需要是Employee
類。因此,如果您執行非法演員(例如將從get()
返回的對象投射到Student
),編譯器會再次發出抱怨。
以下文章可能是幫助理解這一概念:
Generics
是的,我的問題是,編譯器如何檢查它是Employee類型的,它是學生類型 – user1632316
對於downvoter:小心解釋? – Sujay
@Sujay:問題不在於如何更正代碼,而是* how *'List'實際檢測到問題。 –
其實它不是專執行檢查的List
,它是編譯器(正如你暗示的那樣)。
的List
簡單地提供兩條信息:
有一種類型E
與該類型List
被參數化:
public interface List<E> extends Collection<E>
add
接受E
類型的對象的方法:
如果你建立一個List<Employee>
然後編譯器知道,你可以不與任何調用add
除了和Employee
,如果你嘗試會給一個編譯錯誤。
還應該注意的是在運行時沒有這樣的檢查!因此,如果你以某種方式設法「通過」編譯器進行的檢查(例如使用a raw type),那麼你可以對List
執行各種錯誤的操作,並且運行時不會檢測到問題(直到您嘗試以非通用方式訪問「錯誤」類型)。
如果您想運行時檢查,請使用:http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#checkedCollection(java。 util.Collection,java.lang.Class) –
你是對的,它是在'編譯'階段 – meadlai
什麼是錯誤?你能提供一段代碼來重現問題嗎? – Vulcan
只有編譯器可以給你編譯錯誤。 –
我知道它的愚蠢,但是學生是實施還是延伸員工? – user902383