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

在父类java中循环时获取子类,java,Java,我正在循环浏览我的媒体arraylist arraylist,它有一些子类音频、视频、图片 当我循环浏览我的媒体阵列列表时 public double getTotalVideoRunTime() { int total = 0; for(Media v : mList) { if(v.isVideo()) { } } return t

我正在循环浏览我的媒体arraylist arraylist,它有一些子类音频、视频、图片 当我循环浏览我的媒体阵列列表时

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

            }
        }
        return total;
    }
我不知道如何从video类中获取变量“runtime”,是否必须以不同的方式循环?我不确定如何从子类中获取变量,我假设这是可能的,但愿如此

必须使用instanceof并将其强制转换为正确的类

e、 g


不完全确定您想要实现什么,但如果您想要某个类具有的变量,您可以使用:

类似地,如果需要这些方法:

Method[] methods = v.getClass().getMethods()();
for (Method m : methods) m.invoke(arguments...);
我必须警告您,使用反射有很多缺点—性能、安全性—很多时候,如果您需要使用反射,它表明了一个错误

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

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();
}

我认为他只是想访问子方法。抽象类是如何解决这种情况的?他有一个包含子类的列表,其中可能包含特定于子类的方法。@MuratK。您可以捕获接口/抽象类中的常见行为,并让具体实现处理这些差异。这正是抽象方法的作用。是的,我理解。但在这种情况下,他在ArrayList中拥有所有对象,而您不知道对象是否具有具体方法。@MuratK。通过定义媒体的抽象方法,您可以强制每个实现类实现该方法。这就是重点。将列表声明为列表可以确保每个对象都有它的实现。您希望实现什么?是否要调用特定的方法?在这种上下文中使用instanceof是一种巨大的代码气味。@amit为什么会这样?@MuratK。这就像一个大的if/else块或类似开关:如果您忘记保持它的最新状态,那么这个代码就被破坏了。在这里使用多态性会更好。事实上,您调用chileMethodOfVideo和childMethodOfAudio,而不是childMethod的具体实现(由媒体声明并由视频和音频覆盖),这是一种代码味道。它的处理更加优雅、高效,并且更易于使用和维护polymorphism@amit作为一个例子,视频可以播放,图像可以打印,他在开篇文章中写道,这个类是存在的。你怎么可能在这里使用多态性而不是instanceof?
Method[] methods = v.getClass().getMethods()();
for (Method m : methods) m.invoke(arguments...);
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();
}