Java 将子类项添加到超类的ArrayList时出错

Java 将子类项添加到超类的ArrayList时出错,java,eclipse,Java,Eclipse,我有一个超类和几个子类 public abstract class SuperClass { } public class SubClass1 extends SuperClass { } 我创建了一个ArrayList来包含超类类型的对象 private ArrayList<SuperClass> list = new ArrayList<SuperClass>(); 更不用说,我正在调用的一些方法在超类中明确定义,对于类型来说,这些方法是未定义的。我的头都撞到这

我有一个超类和几个子类

public abstract class SuperClass {
}

public class SubClass1 extends SuperClass {
}
我创建了一个ArrayList来包含超类类型的对象

private ArrayList<SuperClass> list = new ArrayList<SuperClass>();
更不用说,我正在调用的一些方法在超类中明确定义,对于类型来说,这些方法是未定义的。我的头都撞到这里了。我完全不知道问题出在哪里

如果你们能给我指出一些可能的方向,我将不胜感激。我不知道我是否提供了足够的信息,所以请提出任何你认为可能适用的问题


提前感谢。

更改此
子类1对象;
对象=新的子类1(参数)

SuperClass object;
object= new SubClass1(parameters);

以下程序对我来说很好(在JRE 1.6上运行)


在查看了所有其他答案和您的问题后,我想到的这种行为的唯一可能原因是您有两个子类1的类文件。一个是子类1扩展了超类,另一个不是。试图在ArrayList中插入子类1的类似乎正在使用后面的类文件。出于同样的原因,超类方法不会出现在子类实例上

检查您的导入并确保您使用的是子类1的正确版本


如果上述方法不能解决问题,那么java源文件和.class文件也可能不同步。删除eclipse项目中的bin文件夹并重新构建该项目。您还可以清理和构建项目,以确保没有任何内容不同步

超类不是子类的一种类型,但反之亦然。我可以将子类型对象添加到您声明的
ArrayList
中。嗯。。。我想知道我真正的错误在哪里,那么……这绝对是那些初学者的通病之一。看看我的答案。@SirYancy。。我认为你应该看看bot的答案,并按照他给出的建议去做。。他指出了最有可能的理由:)这将导致对象切片!不知道它是什么,该学习对象切片了:D谢谢你的新信息anyway@vandey.. 它将如何解决这个问题。。您刚刚更改了代码以实际存储对超类ArrayList的
超类
引用。。这无论如何都会发生。。这不是问题所在。它显示了OOP的更好实践。代码本身没有任何问题,运行良好。您认为类是静态的和嵌套的这一事实有什么区别吗?我应该补充一点,我的类在不同的类文件中。我将我的超类和子类1移动到不同的类,并删除了静态标识符。对我来说仍然很有效:)@SirYancy。。是的,我在这方面也没有遇到任何问题。。这对我来说很管用。。而且它必须起作用。。这是允许的。。你看,
列表
总是可以容纳
,因为
最后是一种动物。。您应该检查是否存在同名的任何其他类。。也许这已经被习惯了。我有一部分人非常害怕地报告说,你非常合理的回答似乎并不能解决我的问题。总而言之,我有一个被定义为抽象的超类和三个(不同的)扩展它的子类。每当我试图将一个子类中的一个对象添加到ArrayList时,就会出现一个java错误。它还拒绝承认任何完全有效的操作实例。我完全被难住了。不过我要问一个问题:你检查我的进口是什么意思?我需要导入同一个包中的类吗?不需要从同一个包中导入类。如果类中有任何将值插入列表的导入语句,只需确保导入了正确的类。你绝对确定你所有的子类和超类都只有一个版本吗?如果我说“是的,我绝对确定”,这会有帮助还是让整个事情变得更混乱?你需要意识到,这样的错误不是凭空出现的,你不会犯错误。我建议您重新开始,如果这只是一个示例程序,您正在编写学习一些概念。创建一个新项目。再次创建完全相同的类。事情应该按预期进行。
for (SuperClass obj : list){
    if (obj instanceof SubClass1){ //This gets an error like this:
         ....                      //Incompatible conditional operand types
    }                              // SuperClass and SubClass1
SuperClass object;
object= new SubClass1(parameters);
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");
            }
        }
    }
}
Test1
Test2