18

ジェネリックスを使用する場合、ここで少し混乱します。Java Genericsを見たことがありますか?しかし、まだいくつか質問があります。

私が持っていると言う:

public class Honda implements ICar(){
}

public class Opel implements ICar(){
}

使用する必要があります:

public class Person{
    ICar car;
    .
    .
    public Person (ICar c){
        car = c;
    }
}

また

public class Person<T extends ICar>{
    T car;
    .
    .
    public Person(T c){
        car = c;
    }
}

またはそれは実行されるタスクに依存しますか?

集約関係(コンテナーなど)専用のジェネリックです。つまり、コレクションに使用されているだけですか?

4

6 に答える 6

16

人は一般的に車のタイプでパラメータ化されていません。非常に迷惑な人だけが彼らの車によって定義されます。人も(時間内に)車を変えます。したがって、セマンティクスの場合のみ、クラスをパラメーター化することはしません。

このようなプログラミングの詳細に入る前に、現実の世界から模倣しようとしていることを考えてください。

于 2012-07-11T16:18:56.660 に答える
12

区別は必ずしも明確ではありませんが、ここにいくつかの手がかりがあります。

  1. それらを「タイプパラメータ」(それらはどれか)と考えてみてください。それらはクラスに関連付けられていますが、必ずしもクラスに関連付けられているわけではありません。(たとえば、コレクションフレームワークを見てください。)
  2. タイプパラメータは、オブジェクトの存続期間を通じて変更されない場合にのみ使用できます。これは非常に明白に聞こえますが、ジェネリックを使用しない場合を決定するのは非常に便利なルールです。(例は車を変えることができる人です。)
  3. 一方、typeパラメーターを使用するインスタンスが少ない場合、オプションが多すぎる場合は、それもお勧めできません。(多くの人は車をまったく持っていないかもしれません。)

そして最後に、私が本当に役立つと思った一般的な考えです。確信が持てない場合は、プロトタイプを作成することを恐れないでください。両方の方法でコードを記述し、どちらがより単純で理解しやすいかを確認します。説明なしで他の人に見せるか、1日か2日待ってから、自分でコードを読み直してください。次に、もう一方を捨てます。コードを捨てるのは良いことです。

于 2012-07-11T16:28:52.227 に答える
8

Tを含むものを取得または返すメソッドがある場合、または他の人があなたのcarフィールドにアクセスできる可能性がある場合は、ジェネリックバージョンが必要です。(メソッドを表示しなかったため、実際にはわかりません。)

たとえば、ジェネリックバージョンでは、のようなメソッドを使用できます。T someMethod();誰かがを持っている場合、ジェネリックがない場合は未知のタイプの車ではなく、電話をかけたときに戻ってくるPerson<Honda>ことができます。HondasomeMethod

同様に、ジェネリックバージョンでは、のようなメソッドを使用できます。void anotherMethod(T anotherCar);誰かがを持っている場合、これにより、車ではなく、このメソッドにPerson<Honda>を渡すように強制されます。Honda

したがって、基本的に、ジェネリッククラスを使用すると、後でオブジェクトの使用に制約を課すことができます(メソッド呼び出しなど)。コンストラクターがTを使用する唯一の場所であり、メソッドまたはフィールドでTを使用する必要がない場合は、はい、その意味はありません。

于 2012-07-11T18:29:55.667 に答える
4

これは、継承とコンポジションの使用に関係しています。

他のセマンティクスを知らなくても、Compositionの方が関連性が高いようです。人は別の人になることなく車を変えることができます。

http://www.artima.com/objectsandjava/webuscript/CompoInherit1.html http://en.wikipedia.org/wiki/Composition_over_inheritance

于 2012-07-11T16:12:53.397 に答える
1

特に使用する場合は、構成(動的バインディングと呼んでいるもの)を好む傾向があります。人はICarの一種ではないので、ここでジェネリックを使用するのはちょっと奇妙です(とにかく私には)。ガレージのように、「ICarのコンテナー」の言い方としてジェネリックスを使用しますが、その場合は、コレクションタイプを変数として使用するか、本当に必要な場合はコレクションタイプを拡張します。

于 2012-07-11T16:11:55.343 に答える
0

最初にセマンティクスに焦点を当てることをお勧めします。

インターフェイスを実装Bmwするクラスとクラスがある場合は、次の質問をします。車を変更することはできますか、それとも別の人に変更することはできますか?ToyotaICarPerson

ジェネリックアプローチではPerson、何らかの理由で既存の人物インスタンスのcar属性の値をからToyotaに変更する必要がある場合、新しいインスタンスを作成する必要がありBmwます。したがって、この新しい人物は前の人物とは異なります。もちろん、特定の車のクラスにフックする代わりに最初のPersonインスタンスを作成することもできますPerson<ICar>が、なぜジェネリックを使用するのでしょうか。

于 2012-07-11T16:33:52.310 に答える