Java ArrayList调用扩展对象函数

Java ArrayList调用扩展对象函数,java,arraylist,casting,extends,Java,Arraylist,Casting,Extends,我有一个ArrayList,正在将“B”对象放入其中。在“B”的代码中,我覆盖了print功能。然而,在我的代码中,我最终得到了在“A”中定义的print函数 我想知道是否有一种方法可以在不使用if语句的情况下获取“B”print函数,即检查“a”是否为“B”的“instanceof”,如果为true,则将“a”转换为“B”,然后调用print。也就是说,我不能使类抽象,也不能使打印抽象 下面是我的代码来说明我的意思: 甲级 public class A { public String

我有一个
ArrayList
,正在将“B”对象放入其中。在“B”的代码中,我覆盖了
print
功能。然而,在我的代码中,我最终得到了在“A”中定义的
print
函数

我想知道是否有一种方法可以在不使用if语句的情况下获取“B”print函数,即检查“a”是否为“B”的“instanceof”,如果为true,则将“a”转换为“B”,然后调用print。也就是说,我不能使类抽象,也不能使打印抽象

下面是我的代码来说明我的意思:

甲级

public class A {

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

public class B extends A {

    public String print() {
        System.out.print("B");
    }
}
主要内容:

ArrayList objects=new ArrayList();
添加(新的B());
a类=对象。获取(0);
a、 打印();
输出=“A”


因此,这将打印“A”。同样,我知道我可以使用if语句检查它是否来自“B”类,然后将类型转换为对象。但是假设我要把整个字母表放进去,我不想要一个if和一堆else-if语句?这是唯一的办法吗?

这似乎对我有效

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();    
    }
}
公共类测试{
专用静态A类{
公开作废印刷品(){
系统输出打印项次(“A”);
}
}
私有静态类B扩展了{
@凌驾
公开作废印刷品(){
系统输出打印项次(“B”);
}
}
公共静态void main(字符串[]args){
ArrayList对象=新的ArrayList();
添加(新的B());
A=objects.get(0);
a、 打印();
}
}
查看代码时,打印函数应该返回
void
而不是
String
,或者更好的是,它们应该实际返回一个字符串,而不是在方法中打印(这样可以修复编译错误)

创建
对象
ArrayList时,缺少type参数(如我的示例所示)

更好的做法是添加
@Override
注释,告诉编译器您实际上正在重写一个方法(参见示例)


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

首先,您的语法错误,这不会编译,因为您的方法签名告诉编译器,它们将返回
字符串
,但是这些方法不会返回
字符串
,它们是
void
,并且应该是
a=objects.get(0)并且修复这些错误实际上会打印“B”,但这不会编译,所以我怀疑您是否测试过它。假设您将其更改为工作代码,那么调用的函数将是实际类型。因此,如果它是a列表中的a B,它仍然会调用B方法。
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();    
    }
}