我知道你只能拥有某种类型的数组(例如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语言
答案 0 :(得分:4)
你有一个超类型的数组。
for
遍历可迭代对象(此处为数组)中的所有项目。
由于数组中可能有Bicycle
或Bus
个实例(甚至其他类型,当前未知),因此您无法将其视为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,在大多数情况下,最好找到描述数组中所有对象所需的通用功能的接口或超类。