如何通过Java中的抽象类访问子类?

时间:2014-02-12 15:32:06

标签: java xml abstract-class

我在Java中有以下代码:

class Info {
    @XmlAnyElement
    @XmlElementRefs({@XmlElementRef(name="apple", type="Apple.class")})
    final private List<Fruit> fruits = new ArrayList<Fruit>();  

    public Info() {
    }

    public List<Fruit> getFruits() {
        return fruits;
    }
}

public abstract class Fruit {
    @XmlElement(name = "label", required = true)
    @XmlJavaTypeAdapter(NormalizedStringAdapter.class)
    String name = null;

    public Fruit() {
    }
}

@XmlRootElement(name="apple")
public class Apple extends Fruit {
    @XmlElement(name = "age", required = true)  
    int age;

    public int getAge() {
        return age;
    }
}

<config>
  <Info>
    <apple>
      <age>20</age>
    </apple>
  </Info>
</config>

然后在主课程中,我如何访问班级Apple以获得苹果的年龄?

class Main() {
    private List<Fruit> fruits = new ArrayList<Fruit>();

    public void getAge() {
        Info info = new Info();
        fruits = info.getFruits();
    }
}

所以在主类中,我们得到一个水果列表,但是如何访问Apple类的getAge()方法?

2 个答案:

答案 0 :(得分:2)

首先,请注意您无法确定Fruit对象是Apple的实例,并且您的fruits对象不是单个Fruit但是List<Fruit>

也就是说,假设您希望getAge返回列表中第一个Apple的年龄,您可以执行以下操作:

public void getAge() {
    int age = -1;
    for(Fruit f : fruits) {
        if(f instanceof Apple) {
            age = ((Apple)f).getAge();
        }
    }
}

答案 1 :(得分:0)

您可以在类Fruit:

中添加抽象方法
public abstract class Fruit {
    @XmlElement(name = "label", required = true)
    @XmlJavaTypeAdapter(NormalizedStringAdapter.class)
    String name = null;

    public abstract int getAge();

    public Fruit() {
    }
}