2012-02-16 16 views
0

すべてCarには特定のタイプのTyreが必要ですか。私はジェネリックを使用できないようにJava 1.3(モバイル用)を使用しています。オーバーライドされたメソッドの戻り値の型を変更するにはどうすればよいですか?

abstract class Car{ 

    private Tyre[] tyres; 

    protected Car(){ 
     tyres = createTyres(); 
    } 

    protected abstract Tyre[] createTyres(); 

    public Tyre[] getTyres(){ 
     return tyres; 
    } 
} 

abstract class Tyre{} 

//Concrete classes 
class SlickTyre extends Tyre{} 

class RacingCar extends Car { 
    public RacingCar(){ 
    } 
    protected SlickTyre[] createTyres(){ 
     return new SlickTyre[]{}; 
    } 
    public SlickTyre[] getTyres(){ 
     //this won't compile as it overrides the parent return type  
    } 
+0

なぜSlickTyreを返すのですか?通常、あなたのRacingCarクラスはFourByFourとCompactのようにTireを返すだけですが、RacingCarが返すTireのTreadDepthプロパティを読み取ると0が返されます。 –

+0

素晴らしい考え方ですが、SlickTyreは 'operatingTemperature'のようないくつかの追加プロパティを持っています'Tyre'の中にうまく座る – donturner

答えて

2

残念ながら、covariant return typeがjava5からのみjavaに追加されました。古いバージョン[1.3など]では、分散戻り型は必要ありません。

あなたはSlickTyreが、他のタイヤの余分な特性/機能を持っている場合、あなたはLSP principleを破ったかもしれないthis article

+0

+1つまり、この例はJava 1.5+でコンパイルされます –

1

でそれについての詳細を読むことができます。

J2ME(モバイルに言及しています)で作業している場合、一般的な習慣は不要であれば抽象化を避けることです。余分なオーバーヘッドは、ジャーのサイズとパフォーマンスに影響する可能性があります。まあ、5年前に電話でjarファイルのサイズを64kb以下にする必要があります。

+1

良い点。 SlickTyreは単にプロパティを追加するだけで、スーパークラスの動作に影響を与える新しい動作を定義していないので、私はLSPに違反しているとは思わない。しかし、私が読むほど、継承は厳密に制限されていると思っています。この場合、「Tyre」インターフェースが適切かもしれません。 – donturner

関連する問題