2016-10-06 1 views
0

でジェネリック型を絞り込むためにどのようにはサンプルコードです: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メソッドに適していますか?

+1

オーバーロードする代わりに 'start()'をオーバーライドしますか? – markspace

+0

@markspace例を編集しました。私はポルシェのインスタンスが必要です。 – Xufeng

+1

マークの意味は です。start()メソッドではなくstart()メソッドをstart()メソッドに変更します。このようにすれば、あなたは何をするつもりかを達成することができます。 –

答えて

0

「実行時に、ポルシェが狭いタイプですのでstartCarは、startメソッドのためのより良いフィットを見つけるだろう、それはないですか?」

ではありません。実行時に

、JVMは、与えられた引数の実際の型に応じて、メソッドのベストフィットを選択するスペアの時間を持っていません。 引数の宣言された型に従って、コンパイル時に最適化が選択されます。

@markspaceが言ったように、あなたはおそらく(スタートを上書きしたい)のではなく、それをオーバーロード。これを行うには、Car.start()Porche.start()の署名を同一にします。引数を削除するか(いずれにしても使用されません)、どちらの場合も引数をCar carと宣言してください。 > start()メソッドを開始する()の代わりにスタート(車)の - 何を言っているかのマーク

+0

悪い例を私に責める。もう一度見てもらえますか? – Xufeng

+0

私は何も見て理解しませんでした。何を達成したいのですか? –

1

は、あなたの車を変更しています。このようにすれば、あなたは何をするつもりかを達成することができます。彼らは、基本クラスのメソッドを(振る舞いを変更する必要があるときにのみ、もちろん子供のクラスは複数のメソッドをも持つことができます)をオーバーライドよう

通常同じ階層内のクラスはまったく同じメソッドのシグネチャを持つ必要があります。オブジェクトは常に自分自身にアクセスできるので、Carインスタンスをメソッドに渡す必要はありません。渡されたパラメータは意味がありません。運転手にとって、運転者は車を入力する必要があります。メソッドを呼び出すために車が入力として必要なのはなぜですか?

+0

以前の悪い例には申し訳ありません。私はこれを完全に変更して、達成しようとしていることをより良く示すようにしました。もう一度見てもらえますか? – Xufeng

+0

車で実装されているインタフェースVehicleを作成してみませんか? LazyManufacturerは車の代わりにVehicleを渡すべきです。 –

関連する問題