Java泛型和多态 - 如何在运行时缩小泛型类型

时间:2016-10-06 04:56:29

标签: java generics polymorphism

以下是示例代码:

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是一种较窄的类型,不是吗?

2 个答案:

答案 0 :(得分:1)

说什么标记是改变你的车 - &gt; start()方法以start()而不是start(Car)。通过这种方式,您将能够达到您的目的。

通常,同一层次结构中的类应具有完全相同的方法签名,以便它们覆盖基类方法(仅当行为需要更改时,子类当然也可以有更多方法)。无需将Car实例传递给方法,因为对象始终可以访问自身。传递的参数没有用处。对于司机来说,是的司机需要有车作为输入。为什么汽车需要自己作为调用方法的输入?

答案 1 :(得分:0)

&#34;在运行时,startCar会更适合start方法,因为保时捷是一种较窄的类型,不是吗?&#34;

难道不是&#39;吨

在运行时,JVM没有空余时间根据给定参数的实际类型选择最适合的方法。 根据声明的参数类型,在编译时选择最佳拟合。

正如@markspace所说,你可能想要覆盖start(),而不是重载它。为此,请使Car.start()Porche.start()的签名完全相同。删除参数(无论如何都不使用),或者在两种情况下都将参数声明为Car car