你有一系列不同种类的物品吗?

时间:2014-12-08 16:13:12

标签: java arrays abstract

我知道你只能拥有某种类型的数组(例如String,int,Student等)。我想知道在继承的情况下这是否成立 - 即扩展Vehicle的Bicycle对象是否可以与其他东西一起放置在Vehicle数组中,如Bus对象。

这是我的代码:

public class Test{
    public static void main(String[] args) {

        Bus bus1 = new Bus();
        Bicycle bike1 = new Bicycle();
        bike1.changeGear(true);
        Bus bus2 = new Bus();
        Vehicle[] myFleet = {bus1, bike1, bus2}; // Note that Vehicle is an abstract class
        for (Bus v: myFleet){ // Trying to access every bus in the Vehicle array. I already
            v.issueTicket(1.50); // tried to get the computer to treat myFleet as a Bus array - doesn't 
            System.out.println(v); // work, sadly.
        }
    }

}

请注意,这是Java语言

6 个答案:

答案 0 :(得分:4)

你有一个超类型的数组。

for遍历可迭代对象(此处为数组)中的所有项目。

由于数组中可能有BicycleBus个实例(甚至其他类型,当前未知),因此您无法将其视为Bus数组。

你可能想要的是:

for (Vehicle v : myFleet) {
     if (v instanceof Bus) {
         Bus b = (Bus)v;
         b.doSomeSpecialThingsForABus();
     }

}

除了visitor pattern之外,没有别的办法。

答案 1 :(得分:1)

如果ClassTwo扩展了ClassOne并且你创建了一个ClassOnes数组,那么你可以将ClassTwo的对象添加到数组中,但是,除非你进行转换,否则你只能访问ClassOne的成员。

答案 2 :(得分:1)

花了一些时间来说明你的观点。

如果您想要执行此类操作,则必须将Vehicle转换为Bus。 但通常你应该有一个所有车辆通用的接口。

由于issueTicket()不适用于自行车,您可能会考虑不使用相同的接口来连接公共汽车和自行车。

另一个想法是为bicecles实现issueTicket()方法,只要它被调用就发出错误信号:

Vehicle[] myFleet = {bus1, bike1, bus2}; // Note that Vehicle is an abstract class
for (Vehicle v: myFleet){
    v.issueTicket(1.50);
    System.out.println(v);
}

然而,在我看来,这仍然感觉像是一种更好的设计。

对于我提供更多建议,最好知道这些对象应存储在同一容器中的原因。

希望有所帮助。

祝你好运, 约尔格

答案 3 :(得分:0)

您可以使用

java.lang.Object[] myFleet;

但这可能泛型。

如果您的对象有一个通用界面(比如Foo),那么您可以使用

Foo[] myFleet;

另请参阅一些Java容器,例如ArrayList

答案 4 :(得分:0)

是...但

,您可以拥有一系列车辆,例如Bus1,Bus2和Bike1。

......但不会阻止你的自行车成为自行车,或者将它变成公共汽车。数组是对象的引用列表,它不会获取对象的新副本并将其转换为数组的类型:对象仍将是其原始类的实例

阵列可以容纳车辆,无论他们的子类如何,它都不会将它们更改为公共汽车,自行车或车辆:类型保持不变。

你可以尝试将自行车作为公共汽车,但是:如果你接受,你将失去任何非公共汽车的属性。您也可以使用instanceof来判断Vehicle是否已经是Bus还是Bike,并在需要时进行转换

for (Vehicle v: myFleet){ // For each vehicle in the fleet
    Bus b = (Bus) v; // Turn the vehicle into a bus
    b.issueTicket(1.50);
    System.out.println(b);
}

答案 5 :(得分:0)

如果总线和自行车都扩展相同的超类或实现相同的接口,则可以将它们放入接口或超类类型的数组中。

要访问它们,您可以检查它们是否是任何子类的实例

for (Vehicle v: myFleet){
    if(v instanceof Bus){
        ((Bus) v).issueTicket(1.50); 
    }
}

然而,建议不要使用instanceof,在大多数情况下,最好找到描述数组中所有对象所需的通用功能的接口或超类。