我正在遍历我的Media arraylist ArrayList,它有一些子类(音频,视频,图片) 当我循环浏览Media arraylist时
public double getTotalVideoRunTime()
{
int total = 0;
for(Media v : mList)
{
if(v.isVideo())
{
}
}
return total;
}
我不确定如何从视频类获取'运行时'这是一个变量,我是否必须循环不同?我不确定如何从子类中获取变量,我认为它是可能的(我希望!)
答案 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();
}