でジェネリック型を絞り込むためにどのようにはサンプルコードです:Javaのジェネリックとポリモーフィズム - ここでは、実行時
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)
がCar
クラスでstart
方法を見るであろうことを理解しています。しかし、実行時にそれを回避する方法はありますか?実行時には、は、が狭いタイプなので、start
メソッドに適していますか?
オーバーロードする代わりに 'start()'をオーバーライドしますか? – markspace
@markspace例を編集しました。私はポルシェのインスタンスが必要です。 – Xufeng
マークの意味は です。start()メソッドではなくstart()メソッドをstart()メソッドに変更します。このようにすれば、あなたは何をするつもりかを達成することができます。 –