2012-03-12 28 views
1

我今天早些時候參加了一門名爲「Java for Android I」的課程考試,發現這個問題我根本得不到。也許你們有些人可以爲我解釋。今天早些時候在考試中遇到麻煩 - ArrayList方法

問:

查看此集合ArrayList的p。一個Person類是一個 學生的超類。 ArrayList實現了List-interface (根據Java-API)。

編譯器不允許在代碼中提到的一些情況。爲什麼? 說明它們如何意味着該p不會含有人 爲什麼實例p不是的ArrayList。例如。 p.add(「Hello」);現在 包含一個String實例。

代碼:

p = new ArrayList<Object>(); 

void method (ArrayList<Student> als) { ... } 

void method (List<Person> lp) { ... } 

void method (ArrayList<Object> alo) { ... } 

你如何描述這個問題?我只是不明白我的教授想要我回答什麼。

對不起,如果報價已經搞亂了語法。我一直在翻譯瑞典語。

+0

是這樣問題的完整代碼? – DNA 2012-03-12 19:12:26

+0

'p'與方法聲明有什麼關係? – aioobe 2012-03-12 19:13:26

+0

我猜在翻譯中有一些東西丟失了...... – csturtz 2012-03-12 19:16:06

回答

4

你的教授的問題是關於Java泛型類型檢查的基礎知識。假設:

class Person { 
} 

class Student extends Person { 
} 

這是一個有效的片段:

List<Person> list = new ArrayList<Person>(); 

因爲是這樣的:

List<Object> list = new ArrayList<Object>(); 

這顯然是無效的,因爲一個對象可以是一個Person實例,而不作爲一個Student實例:

List<Student> list = new ArrayList<Person>(); 

是我最喜歡的 - 它總是旅行的人了:

List<Person> list = new ArrayList<Student>(); 

這是一個無效的片段。 「什麼爲什麼!」我聽到你問。好了,這是真的,所有Student對象也都是Person情況下,這樣的分配是這樣工作的:

Person person = new Student(); 

當涉及到的參數類型,不過,Java編譯器會盡力保護你。想象一下,這段代碼:

List<Person> list = new ArrayList<Student>(); 

list.add(new Person()); 

如果編譯器不反對的分配,這將是現在可能進入Person對象的ArrayList只有主機Student對象...

方法調用工作完全一樣。剛剛從剝離方法簽名中參數的類型,並試着想象一個分配給該類型...

0

沒有完全理解你的問題,但

第一種方法和第三種方法是重複的方法,按照在Java超載規則。編譯器會說他們是重複的方法。

1

很難從你提供的內容中肯定地告訴你,但教授似乎試圖測試你對泛型的一些微妙之處的理解。

事實上,他沒有顯示參考p的聲明是一條線索。

如果經過參考P此是合法的:

方法(ArrayList的< \對象> ALO)//因爲類型和參數 匹配準確

這些是非法:

method(ArrayList<Student> als) //because the method will expect Student and will get Object 
method(List<Person>) //same reason.. expects list of Person, and will get Objects 
+0

您可能是對的,我想我現在得到問題了。仍然認爲這個問題寫得很糟糕。感謝幫助兄弟! :) – user1258829 2012-03-12 19:40:22

0

或者它可能是有關以下 - 我不知道肯定:)

// take some method 
void method (ArrayList<Object>) { /* ... */ } 

// and an Object 
ArrayList<Object> p = new ArrayList<Object>(); 

現在你可以說method(p)它會工作,因爲方法預計ArrayList<Object>。但是

ArrayList<Student> q = new ArrayList<Student>(); 
method (q); 

不起作用。因爲ArrayList<Student>不是ArrayList<Object>,雖然Studend extends Object。爲了讓你必須定義方法:

void method (ArrayList<? extends Object>) { /* ... */ } 
// or shorter but the same 
void method (ArrayList<?>) { /* ... */ } 

如果你想要,可以採取兩種ArrayList<Person>ArrayList<Student>(個人的和所有其他子類)的方法,你必須聲明它

void method (ArrayList<? extends Person>) { /* ... */ }