我有一个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语句?这是唯一的方法吗?
答案 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);
的实例,而是需要将其实际声明为类型A
或B
(再次参阅我的示例) )