以下是示例代码:
public class Whatever
{
public static void main(String[] args)
{
LazyManufacturer manufacturer = new LazyManufacturer();
Porsche oldPorsche = new Porsche();
Porsche newPorsche = new Porsche();
manufacturer.updateCar(oldPorsche, newPorsche);
// for a car that I do not know the brand of, I would instantiate Car directly. So Car cannot be abstract
}
}
public class Car {
private String carCommonAttribute;
public void updateAccordingTo(Car car) {
carCommonAttribute = car.carCommonAttribute;
System.out.println("common updated");
}
}
public class Porsche extends Car {
private String porscheExclusiveAttribute;
public void updateAccordingTo(Porsche car) {
super.updateAccordingTo(car);
porscheExclusiveAttribute = car.porscheExclusiveAttribute;
System.out.println("porsche exclusive updated");
}
}
public class Garbage extends Car {
private String garbageAttribute;
// similar to Porsche
}
public class LazyManufacturer {
public <T extends Car> void updateCar(T oldCar, T newCar) {
oldCar.updateAccordingTo(newCar);
}
}
我知道这是一个不好的例子,但它足以说明我想要实现的目标。
现在输出为"common updated"
。我也希望看到"porsche exclusive updated"
。
我了解在编译时,startCar(car)
会在start
类中看到Car
方法最合适,因为它的签名完全匹配它所寻找的内容。但是,有没有办法在运行时解决这个问题?在运行时,startCar
会更适合start
方法,因为Porsche
是一种较窄的类型,不是吗?
答案 0 :(得分:1)
说什么标记是改变你的车 - &gt; start()方法以start()而不是start(Car)。通过这种方式,您将能够达到您的目的。
通常,同一层次结构中的类应具有完全相同的方法签名,以便它们覆盖基类方法(仅当行为需要更改时,子类当然也可以有更多方法)。无需将Car实例传递给方法,因为对象始终可以访问自身。传递的参数没有用处。对于司机来说,是的司机需要有车作为输入。为什么汽车需要自己作为调用方法的输入?
答案 1 :(得分:0)
&#34;在运行时,startCar会更适合start方法,因为保时捷是一种较窄的类型,不是吗?&#34;
难道不是&#39;吨
在运行时,JVM没有空余时间根据给定参数的实际类型选择最适合的方法。 根据声明的参数类型,在编译时选择最佳拟合。
正如@markspace所说,你可能想要覆盖start(),而不是重载它。为此,请使Car.start()
和Porche.start()
的签名完全相同。删除参数(无论如何都不使用),或者在两种情况下都将参数声明为Car car
。