4

我有一个带有几个子类的超类。

public abstract class SuperClass {
}

public class SubClass1 extends SuperClass {
}

我创建了一个 ArrayList 来包含 SuperClass 类型的对象。

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 的类文件。一种是 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 回答