迭代ArrayList时如何获取对象方法?

时间:2016-03-05 03:29:41

标签: java eclipse arraylist

我试图弄清楚如何在迭代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。

2 个答案:

答案 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的子类(例如ShoesSocks)定义他们想要打印。

因此,在这种情况下,Shoes将覆盖printTo并打印出相应的鞋号。这由Shoes定义,允许直接访问所有信息,例如size

Socks定义printTo以打印出相应的颜色。再一次,这最多可以Socks来定义打印的内容和方式。

现在在循环中,如果Clothes对象是ShoesSocks并不重要,它们都会从printTo继承Clothes方法。然后调用此方法,将其留给Clothes的实现来确定打印的内容和方式。

abstract method

答案 1 :(得分:0)

好的我明白了。我唯一要做的就是打电话

new Main();

里面的

public static void main(String[] args)

并将我的所有代码放在Main()中,一切正常。