我正在通过Java多态性练习,努力理解类型转换以及如何调用特定于子类的方法。我有一班狗:

public class Dog
{
    private final String breed;

    public Dog(String b)
    {
        breed = b;
    }

    //More Dog methods (bark, eat, etc.)
}


以及可以拉雪橇的子类SledDog:

public class SledDog extends Dog
{
    public SledDog(String b)
    {
        super(b);
    }

    public void pullSled()
    {
        System.out.println("pulling the sled");
    }
}


在我的申请中,我声明了3只狗-两只普通狗和一只SledDog。我将它们传递到Dogs数组中,然后遍历该数组。如果这只狗是雪橇犬,我希望他去pullSled()-但我不知道如何调用该方法,因为它属于子类。我的指令告诉我将数组项转换为SledDog对象,但是我不知道该怎么做或为什么要这样做。我以为,由于传递给数组的对象已经是SledDog,因此它应该可以访问pullSled()。这是我的尝试。

public class DogApp
{
    public static void main(String[] args)
    {
        Dog firstDog = new Dog("Greyhound");
        Dog secondDog = new Dog("Terrier");
        SledDog sledDog = new SledDog("Husky");

        Dog[] dogArray = new Dog[]{firstDog, secondDog, sledDog};

        for(Dog d : dogArray)
        {
            //Makes sense, only want to pullSled() if d is a SledDog
            if(d instanceof SledDog)
            {
                // This is the part I'm confused about
                d = (SledDog) d;
                d.pullSled();
            }
        }
    }
}

最佳答案

您非常接近,只需对其进行强制转换并调用该方法:

((SledDog)d).pullSled();


if (d instance of SledDog)条件内。

另外,我看不到dogArray的声明。确保正确声明并初始化了它。

09-27 14:55