我试图弄清楚如何在迭代ArrayList时使用对象的方法。但是,有一部分问题我不能适应上面的问题,而且在ArrayList中有一些对象,让我们称之为鞋子,继承自,就像衣服一样。但是这个阵列中还有衬衫和袜子,每个都继承自服装。因此阵列的类型为Clothes,以便容纳其中的不同类型的对象。观察:
ArrayList<Clothes> list = new ArrayList<Clothes>();
list.add(shoe);
list.add(shirt);
list.add(sock);
这是有效的,因为它们都来自衣服。但是,我试图遍历这个ArrayList并使用每个对象的独特方法,如下所示:
for(Clothes piece : list) {
...//something like piece.getShoeSize();
}
说我想打印鞋子&#39;按下按钮时的尺寸,或按下不同按钮时每个袜子的颜色。我无法做到这一点,因为在for循环本身,它只是寻找衣服类型的东西,但是当我将衣服换成鞋子时,它也不起作用,因为list是一个类型列表衣服。我已经尝试将 piece 作为鞋子或衬衫进行投射,具体取决于if语句的结果
if(piece instanceof Shoe) {
...//((Shoe) piece).getShoeSize();
}
但这也不起作用。如果您有任何想法,我将非常感谢您的帮助。
编辑:为清楚起见。
这是类层次结构:
public class Clothes {
getColor();
}
public class Sock extends Clothes {
...
}
public class Shirt extends Clothes {
getSize();
}
public class Shoe extends Clothes {
getSize();
}
所以我的程序有一个JComboBox,里面有各种各样的东西。它下面还有一个JTextArea。我想让我的程序做的是在JTextArea中输出一些东西,具体取决于在JComboBox中选择了什么选项。所以,让我们说JComboBox中有一个选项SIZE。当它被选中时,我希望list
中所有能够执行方法getSize()
的对象执行方法getSize()
,该方法打印出的大小为getSize()
对象(如XL或10.5)到JTextArea。现在,因为班级衣服没有list
方法(因为并非所有衣服都有明确的尺码。例如,袜子),我遇到了问题。 piece
的类型为Clothes,因此在for循环中,我必须将对象的类型声明为Clothes。但是getSize()
因此也是衣服类型,所以当我尝试在其上运行getSize()
时,它会给我一个错误,因为衣服中没有方法list
。但是,list
中的某些对象确实有此方法。所以我的问题是如何为ArrayList {{1}}中的对象访问此方法,该方法的类型为Clothes。
答案 0 :(得分:1)
你可以使用继承来做得非常好!
public abstract class Clothes {
public abstract void printTo(JTextArea out);
}
public class Shoes {
private int size;
public Shoes(int size) {
this.size = size;
}
@Override
public void printTo(JTextArea out) {
out.println("Shoe size is: " + size);
}
}
public class Socks {
private String color;
public Shoes(String colr) {
this.color = color;
}
@Override
public void printTo(JTextArea out) {
out.append("Socks color is: " + color);
}
}
然后,你可以简单地称它为:
JTextArea myArea = new JTextArea();
list.add(new Shoes(12));
list.add(new Socks("red with a dash of blue"));
for (Clothes piece : list) {
piece.printTo(myArea);
}
得到类似的东西:
Shoes size is: 12
Socks color is: red with a dash of blue
此处,Clothes
有一个名为printTo
的{{3}},允许Clothes
的子类(例如Shoes
和Socks
)定义他们想要打印。
因此,在这种情况下,Shoes
将覆盖printTo
并打印出相应的鞋号。这由Shoes
定义,允许直接访问所有信息,例如size
。
Socks
定义printTo
以打印出相应的颜色。再一次,这最多可以Socks
来定义打印的内容和方式。
现在在循环中,如果Clothes
对象是Shoes
或Socks
并不重要,它们都会从printTo
继承Clothes
方法。然后调用此方法,将其留给Clothes
的实现来确定打印的内容和方式。
答案 1 :(得分:0)
好的我明白了。我唯一要做的就是打电话
new Main();
里面的
public static void main(String[] args)
并将我的所有代码放在Main()中,一切正常。