2017-05-05 2 views
1

私はlist<Car>と、Carオブジェクトを返すいくつかのメソッドを含むラッパークラスを持っています。Generics(?)、Objectを使用するか、クラスを分離する方が良いですか?

私はlist<Bike>を含む別のクラスが必要ですが、同じ実装ではもちろん戻り値の種類が異なる(Bike)同じメソッドが必要です。

私は、コードを繰り返さないようにして、あるクラスを避けるためにlist<?>またはlist<Object>を使うことができると考えていましたが、オブジェクトを返すときにキャストを行う必要があります。

あなたはどちらが効率的だと思いますか?

+0

私が思うに、あなたは車輪の再発明しようとしています。 –

+0

クラスを汎用化してみませんか?または、汎用ベースクラスを使用します。 –

+4

クラス「Vehicle」、「VehicleList 」を作成し、「Car」と「Bike」​​を「Vehicles」に拡張します。そして、あなたは 'VehicleList 自転車;'と 'VehicleList cars;' – QBrute

答えて

2

を参照してください一般的な方法

を書くことができ

public class MyClass<T> { 
private T t; 
..... 

この方法として、あなたのクラスを設定することができ、あなたは完全に利用するために次のような構造を持つことができますジェネリック医薬品のあなたが持っているしたいところはどこでも

抽象親クラス

abstract class Vehicle { 
    ... 
} 

ジェネリックは、リストのコンテナクラス

class VehicleList<T extends Vehicle> { 
    private final List<T> vehicles; // Or any other way you want to hold your data 
    ... 
} 

、その後Vehicle

class Car extends Vehicle { 
    ... 
} 

class Bike extends Vehicle { 
    ... 
} 

から継承具象クラスを有界Vehicleのリストは、次のように使用できます以下:

VehicleList<Car> cars = ...; 
VehicleList<Bike> bikes = ...; 
+0

私は同意しましたが、抽象クラスの代わりに私たちはインタフェースを持つことができます。サブクラスにはオプションがあります。 –

+1

おそらく彼はインターフェイスは、メソッドの実装がすべての "子"クラスに対してまったく同じだからです。 – JohnLocke

0

効率を上げるためには問題ありません。あなたは非常に速い操作である単一のキャストに気付かず、ジェネリックスはしばしばボンネットの下でキャストします。

ただし、このシナリオ

のために私はlist<Car>Carオブジェクトを返すいくつかのメソッドが含まれている(それはちょっとラッパーのだ)クラスを持っています。

list<Bike>と、同じ実装ではもちろん戻り値の種類が異なる別のクラス(Bike)を含む別のクラスを作成する必要があります。

それはList<?>またはList<Object>を使用するのではなく、おそらく囲まれた、独自のクラスをジェネリックにするためにではない、より合理的なのです。

0

これはパフォーマンスの問題ではありません。私はそれが可読性、明快さ、そして理解についてだと思う。

CarBikeなどはすべて共通の基本クラスまたはインターフェイス(たとえばVehicle)を拡張する場合に最適です。あなたは、ベース車両インターフェースでジェネリックを使用する場合

あなたのクラスには、次のようになります。

public class VehicleRepo<T extends Vehicle> { 
    private List<T> vehicles; 
    private T vehicle; 

    T getVehicle() { return this.vehicle; } 
} 
関連する問題