2012-03-12 10 views
1

私は今日の "Android for Java"というコースの試験を受けています。多分あなたの何人かが私のためにそれを説明するかもしれません。今日の試験のトラブル - ArrayListのメソッド

質問:

見るこのコレクションのArrayList P。 Personクラスは、 スーパークラスのStudentクラスです。 ArrayListは、List-interface (Java-APIに準拠)を実装しています。

コンパイラでは、コードに記載されている状況のいくつかを許可しません。どうして? は、彼らがPは文句を言わない人 か、なぜPArrayListのないのインスタンスを含むことを伴う可能性がどのように説明してください。例えば。 p.add( "Hello"); now にはStringインスタンスが含まれています。

コード:

p = new ArrayList<Object>(); 

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

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

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

どのようにこの問題を説明しますか?私は、私の教授が私に答えたいものを手に入れません。

引用文が文法を混乱させる場合は、申し訳ありません。私はそれをスウェーデン語から翻訳してきました。

第一の方法及び第3の方法は、Javaのオーバーロード規則どおり重複の方法があるけれども

+0

を宣言する必要が両方ArrayList<Person>ArrayList<Student>(人の他のすべてのサブクラス)を取ることができます方法が必要な場合ということです:あなたがメソッドを定義する必要があることできるようにするには質問の完全なコード?? – DNA

+0

'p'はメソッド宣言と何が関係していますか? – aioobe

+0

翻訳で失われたものがいくつかあると思います... – csturtz

答えて

4

教授の質問は、Javaジェネリックのタイプチェックの基本についてです。仮定すると:

class Person { 
} 

class Student extends Person { 
} 

これが有効なスニペットです:オブジェクトがされずにPersonインスタンスである可能性があるため

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

これは、明らかに有効ではありません。これはあるよう

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

Studentインスタンス:

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

しかしこのは私のお気に入りです - それは、常に人々をトリップ:

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

これは無効なスニペットです。 「何?なぜ!私はあなたが聞くのを聞きます。それは、パラメトリックタイプに来るとき

Person person = new Student(); 

、しかし、Javaコンパイラがあなたを守るために最善をつくします:まあ、それはこの作品のように代入すると、そのように、すべてのStudentオブジェクトは、またPersonのインスタンスであることは事実です。コードのこの部分を想像:

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

list.add(new Person()); 

コンパイラは割り当てに反対しなかった場合は、それだけでStudentオブジェクトをホストArrayListPersonオブジェクトを入力できるようになりましたでしょう...

方法が仕事を呼び出しますまったく同じように。ただ、メソッドシグネチャから引数の型を削除し、その型への割り当てを想像してみてください...

0

は完全に、あなたの質問を理解していませんでした。コンパイラはそれらが重複するメソッドだと言うでしょう。

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

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>ではありません。

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

あなたはそれを

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