-3

クラス ArrayListTest のコードの最後にある 2 つのメソッド ヘッダーでコンパイル時エラーが発生するのはなぜですか?

ArrayListTest: http://pastebin.com/dUHn9vPr

学生: http://pastebin.com/3Vz1Aytr

次の 2 行でコンパイル エラーが発生します。

delete(CS242, s3)

replace(CS242, s, s4);

コードを実行しようとすると、次のように表示されます。

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    The method replace(ArrayList<Student>, Student, Student)in the type ArrayListTest is not applicable for the arguments (List<Student>, Student, Student)
    The method delete(ArrayList<Student>, Student) in the type ArrayListTest is not applicable for the arguments (List<Student>, Student)
        at ArrayListTest.main(ArrayListTest.java:54)

私はEclipseを使用しているため、コンパイル時エラーを修正しました。Eclipseは、コンパイル時エラーを修正するために使用できるコードのオプションを提供します。「メソッドを「replace(ArrayList, Student, Student)」から「replace(List, Student, Student)」に変更することにしました。

コンパイル時エラーは修正されましたが、そもそもコンパイル時エラーが発生した理由と、エラーが効果的に修正された理由がわかりません

以下の2つの方法を修正するために、どの欠落しているコードを書く必要があるのか​​ よくわかりません。

public static void replace(List<Student> cS242, Student oldItem,
                Student newItem) {

public static void delete(List<Student> cS242, Student target){
4

4 に答える 4

2

これは、次のように宣言していたためですArrayList<Student>

List<Student> CS242 = new ArrayList<Student>(25);

そしてあなたのreplace方法は次のとおりです:

public static void replace(ArrayList<Student> aList, Student oldItem, Student newItem) {
}

ListJava の場合、sでのみ機能するメソッドにa を渡しますArrayListそれが可能であれば、たとえば、実装を a に変更しても、正しくない にLinkedList<Student>渡すことができます。replace

を使用するかreplace(List<Student>)、または として宣言CS242ArrayList<Student> CS242ますが、前者がベスト プラクティスと見なされます。

于 2012-09-22T00:24:42.433 に答える
0

欠落している 2 つのメソッドについては、メソッドList.indexOf()List.remove()がここで非常に役立ちます。

于 2012-09-22T01:29:24.063 に答える
0

貼り付けたコードでは、 と の 2 つのメソッドは に変更されていませreplaceん。これがコンパイルエラーの原因です。deleteList<Student>

9 行目で ArrayList を作成し、それを List 変数に保存しているため、これらは最初から存在します。ArrayList は List を実装しているため、これは正常に機能します。したがって、すべての ArrayList も List です。後で、前述のリストを使用して、ArrayList をパラメーターとして必要とする関数を呼び出そうとします。この特定の List も ArrayList ですが (ArrayList コンストラクターを使用したため)、これはすべての List に当てはまるわけではありません。したがって、これを明示的にキャストするか、最初に ArrayList として保存する必要があります。

于 2012-09-22T00:23:59.830 に答える
0

このメソッドでは、リスト タイプを渡すpublic static void replace(ArrayList<Student> aList, Student oldItem, Student newItem) ことはできません。List<Student>

つまり、最初の引数はArrayList(またはサブクラス) である必要があります。署名を に変更したときにpublic static void replace(List<Student> aList, Student oldItem, Student newItem)、 の引数CS242の型List<Student>が予想される引数の型と一致しました。

于 2012-09-22T00:24:27.927 に答える