4

いくつかのサブクラスを持つスーパークラスがあります。

public abstract class SuperClass {
}

public class SubClass1 extends SuperClass {
}

SuperClass型のオブジェクトを含むArrayListを作成しました。

private ArrayList<SuperClass> list = new ArrayList<SuperClass>();

私がEclipseで見ているエラーは、いくつかあります。
まず、サブクラスのオブジェクトを追加しようとするとエラーが発生します。

SubClass1 object;
object = new SubClass1(parameters);

list.add(object)  //I get error: The method add(SuperClass) in the type 
                  //ArrayList<SuperClass> is not applicable for the arguments 
                  //(SubClass1)

コードの後半で、あるタイプを別のタイプにキャストしようとすると、さらに多くの問題が発生します。

for (SuperClass obj : list){
    if (obj instanceof SubClass1){ //This gets an error like this:
         ....                      //Incompatible conditional operand types
    }                              // SuperClass and SubClass1

言うまでもなく、私が呼び出しているメソッドの中には、タイプに対して未定義として表示されるスーパークラスで明確に定義されているものがあります。ここで頭を叩いています。何が問題なのか全くわかりません。

もし皆さんが私をいくつかの可能な方向に向けることができれば、私は大いに義務づけられるでしょう。十分な情報を提供したかどうかはわかりませんので、該当すると思われる質問があればお問い合わせください。

前もって感謝します。

4

3 に答える 3

5

他のすべての回答と質問を調べた後、この種の動作について頭に浮かぶ唯一の考えられる理由は、SubClass1用に2つのクラスファイルがあることです。SubClass1がSuperClassを拡張するものと、拡張しないもの。ArrayListにSubClass1を挿入しようとするクラスは、後のクラスファイルを使用しているようです。同じ理由で、スーパークラスのメソッドはサブクラスのインスタンスに表示されません。

インポートをチェックして、正しいバージョンのSubClass1を使用していることを確認してください。

上記の方法で問題が解決しない場合は、Javaソースファイルと.classファイルが同期していない可能性もあります。eclipseプロジェクトのbinフォルダーを削除し、プロジェクトを再ビルドします。プロジェクトをクリーンアップしてビルドし、同期していないものがないことを確認することもできます。

于 2012-10-07T08:09:14.813 に答える
2

次のプログラムは私にとっては問題なく動作します(JRE 1.6で実行)

public class Test {
    public static abstract class SuperClass {
    }

    public static class SubClass1 extends SuperClass {
        public SubClass1() {

        }
    }

    public static void main(String[] args) {
        ArrayList<SuperClass> list = new ArrayList<SuperClass>();
        SubClass1 object;
        object = new SubClass1();
        System.out.println("Test1");
        list.add(object); 
        for (SuperClass obj : list) {
            if (obj instanceof SubClass1) { 
                System.out.println("Test2");
            }
        }
    }
}

編集: SuperClass と SubClass1 を別のクラスに移動し、静的識別子を削除した後でも、同じ出力が得られます

出力:

Test1
Test2
于 2012-10-07T06:41:17.650 に答える
0

SubClass1 object; object = new SubClass1(parameters);これをに変更します

SuperClass object;
object= new SubClass1(parameters);
于 2012-10-07T06:34:35.820 に答える