2012-02-16 5 views
3

私の背中のソリッドなC++では、いくつかのJavaの概念が100%明確ではありません。YAJGCQもう1つのJavaジェネリックスとコレクションQ

List<SomeInterface> list = new ArrayList<SomeImplementation>; 

これは100%の明確なニーズ説明なしである -

interface Drivable {...} 
class Car implements Drivable {...} 
class Bike implements Drivable {...} 
class Skateboard implements Drivable {...} 

class MyGarage{ 
List<Driveable> myRides; 

public void addRides(List<Driveable> rideList){...} 

List<Car>で呼び出すことはできません...しかし、それは結果を持っています。

public void addCars(List<Car> carList){ 
myRides.addAll(new List<Driveable>(carList)); 

Q1:しかし、私はによりmyRidesに車を追加することができ、これは良いアイデアですか?

私は本当に最初の機能が好きです。 C++ const&に対応してをコピーすると、のmyListに入ってくるcarListがコピーされます。私はcarListが違法なアクセスから保護されていると考えています。ファンクションの引数としてfinalを追加したいとの私の希望は打ち砕かれました。

Q2:完全に呼び出し可能なaddRides(List<Driveable> rideList)を動作させる方法はありますか?

法的には、法的に過負荷です(List<Car> List<Bike> etc)。

はい、別の機能を追加することでaddBikes() addCars etcを追加することもできますし、それぞれの呼び出しでnew List<Drivable>を行うこともできます。しかし、私はより洗練された何かを望んでいます。

質問3:何か提案がありますか?

ありがとうございます! アダム

+1

+1を必要とするのと同じ理由です。 – Lukasz

+1

PECS(プロデュース: 'extend'; Consumes:' super')頭字語は、必ず暗記する価値があります。それはジェネリックスを取る関数を作るたびに従うべきルールです。 http://stackoverflow.com/questions/2723397/java-generics-what-is-pecs –

答えて

4

あなたaddRides方法は次のようにする必要があります:ジェネリック医薬品の使用状況に関する疑問に、java.utilのにコレクションインタフェースを探すとき

、彼らは多くの例を、持っている何何をしたいのかは同じですCollection.addAll()と同じです。

+0

ありがとうございます。明確かつ迅速な答え。 – Adam

0

A1。より良い保護のために、リストをCollections.unmodifiableList()で包むことができます。

A2。 rideListにはが含まれており、ドライブ可能なには何も含まれていないため、public void addRides(List<? extends Driveable> rideList){...}が必要です。

A3。どういたしまして!

0

汎用パラメータにワイルドカードタイプを使用します。宣言は

addRides(List<? extends Driveable> list); 

です。これは、車、スケートボード、バイク、または他のドライブ可能なリストを受け入れ、正しくコンパイルされます。

0

次のようなあなたの方法をparametizingことでこれを実現することができます

基本的にあなたの方法は、Tが駆動可能から延びるように、オブジェクトTの任意のリストを受け入れることを宣言
public class MyGarage{ 
    public static void main(String[] args) { 
     MyGarage garage = new MyGarage(); 
     garage.addRides(new ArrayList<Car>(4)); 
     garage.addRides(new ArrayList<Bike>(4)); 
    } 

    List<Driveable> myRides; 

    public <T extends Driveable> void addRides(List<T> rideList){ 
     // ... 
    } 
} 

。プロデューサとコンシューマの観点からJava Genericsを記述するthis excellent SO postを読むことをお勧めします。あなたが要求していない

0

質問は、なぜこれがコンパイルできないコード

List<SomeInterface> list = new ArrayList<SomeImplementation>; 

の非常に最初の行にされている必要がありますか?

そうでない理由は、あなたがYAJGCQの頭字語用public void addRides(List<? extends Driveable> rideList)

+0

コンパイルされない理由は100%明確です。私はその質問をしなかったのです!そしてその声明は、私が知っていることを確立するためにそこにあった、そしてジェネリックの知識を超えたものは何かを確立することでした。 – Adam

+0

私の謎めいた答えには申し訳ありません。それがコンパイルされないのは 'List 'を 'List 'に割り当てることができないためです。同様に 'List carList'は' addRides'の 'List 'パラメータに束縛することはできません。どちらの場合でも、タイプ制約が必要です。 'List <? extends SomeInterface> list = new ArrayList ' –

+0

あなたの答えは謎めいたものではありませんでした。それはほとんど無益だった。私はその理由を知っています。私はいつもそれを知っていた。私は何かを求めていた。 – Adam

関連する問題