Java ArrayList调用扩展对象函数

时间:2014-06-16 01:49:10

标签: java arraylist casting extends

我有一个ArrayList<A>,正在推出&#34; B&#34;对象进入它。在&#34; B&#34;的代码中我正在覆盖print函数。但是,在我的代码中,我最终获得了在&#34; A&#34;中定义的print函数。代替。

我想知道是否有办法获得&#34; B&#34;打印函数不使用if语句检查是否&#34; A&#34;是一个&#34;实例&#34; &#34; B&#34;,如果为真,那么铸造&#34; A&#34;到&#34; B&#34;然后调用print。我们还要说,我不能使课程抽象化,也不能使印刷抽象化。

这是我的代码,以显示我的意思:

A类

public class A {

    public String print() {
        System.out.print("A");
    }
}

B类

public class B extends A {

    public String print() {
        System.out.print("B");
    }
}

主:

ArrayList<A> objects = new ArrayList();
objects.add(new B());

Class a = objects.get(0);
a.print();

输出=&#34; A&#34;

所以这将打印&#34; A&#34;。再一次,我知道我可以使用if语句检查它是否来自&#34; B&#34; class然后将类型转换为对象。但是,让我们说我要将整个字母表放入其中,我不想要if和一堆if if语句?这是唯一的方法吗?

1 个答案:

答案 0 :(得分:0)

这似乎对我有用。

public class testing{
    private static class A{
        public void print(){
            System.out.println("A");
        }
    }
    private static class B extends A{
        @Override
        public void print(){
            System.out.println("B");
        }
    }
    public static void main(String[] args) {
        ArrayList<A> objects = new ArrayList<A>();
        objects.add(new B());
        A a = objects.get(0);
        a.print();    
    }
}

在查看代码时,print函数应该返回void而不是String,或者更好的是它们实际上应该返回一个String而不是在方法中打印(这样可以修复编译错误)。

创建objects ArrayList时,你缺少type参数(似乎是我的例子)。

更好的做法是添加@Override注释以告诉编译器您实际上覆盖了一个方法(参见示例)

最后,您不能以A的方式声明Class a = objects.get(0);的实例,而是需要将其实际声明为类型AB(再次参阅我的示例) )