在循环其父类java时获取子类

时间:2015-04-30 10:03:09

标签: java

我正在遍历我的Media arraylist ArrayList,它有一些子类(音频,视频,图片) 当我循环浏览Media arraylist时

public double getTotalVideoRunTime()
    {
        int total = 0;
        for(Media v : mList)
        {
            if(v.isVideo())
            {

            }
        }
        return total;
    }

我不确定如何从视频类获取'运行时'这是一个变量,我是否必须循环不同?我不确定如何从子类中获取变量,我认为它是可能的(我希望!)

2 个答案:

答案 0 :(得分:1)

您必须使用instanceof并将其投射到正确的班级。

e.g。

if(v instanceof Video){
Video a = (Video) v;
a.childMethodOfVideo();
}

if(v instanceof Audio){
Audio a = (Audio) v;
a.childMethodOfAudio();
}

答案 1 :(得分:1)

不完全确定您要实现的目标,但如果您想要某个类的变量,则可以使用reflection API

Field[] fields = v.getClass().getFields();
for (Field f : fields) System.out.println(f.getName());

同样如果你想要方法:

Method[] methods = v.getClass().getMethods()();
for (Method m : methods) m.invoke(arguments...);

我必须警告你,使用反射有很多缺点(性能,安全性) - 很多时候如果你需要使用它,它表示code smell

如果您正在尝试为某个类执行某些特定行为,那么正确的方法是将其实现为抽象方法,并调用它 - 将选择动态类型,并调用所需的方法:< / p>

public abstract static class Media { 
    abstract public void foo();
}
public static class Video extends Media{
    @Override
    public void foo() {
        System.out.println("video");

    }
}
public static class Image extends Media{
    @Override
    public void foo() {
        System.out.println("image");

    }
}

public static void main(String ar[]) {
    Media m = new Video();
    m.foo();
}