2012-02-17 17 views
0

は簡単な例です:あなたが思っている場合にはJava Generics - パラメータ化はいつ必要ですか?ここで

class World<S extends Sprites, B extends Bodies> { 

// Both of these have a problem... 

static World world = null; // "World is a raw type. References to generic type 
          // World<BOD,SPRT> should be parameterized" 

static World<S, B> world = null; // "Cannot make a static reference to the non-static type S 
         // "Cannot make a static reference to the non-static type B 

// The following is allowed but looks ugly/fishy to me 
static World<?, ?> world = null; // 

、私は行くシングルトンパターンを取得しようとしています。課題は、このクラスが別のパッケージGAMEで拡張されているため、このパッケージ(MODEL)にそのGAMEに依存することはできません。したがって、コンストラクタはMODELでなければなりません。したがって、コンストラクタにMODELのこのクラスの静的変数にシングルトンオブジェクトを格納させても問題ありません。

static World<?, ?> world = null;は本当にあなたの意見では醜いですか?これにはより良い方法がありますか?ありがとう!

+3

Javaにはタイプ消去があります。 'World'クラスをどのように多くインスタンス化するにしても、静的な' world'変数は1つしかありません(ランタイムに関する限り、すべて同じクラスを共有するため)。 –

+0

私は最初に世界をシングルトン/静的にしません。 2つの世界が存在する別のGAMEを書くとどうなりますか?いずれにしても、あなたの 'GAME'パッケージにあるものは、'世界 'を1つしか作成しないことを確認するまでは、私のようです。これで今のところあなたの質問に答えることができ、代わりに質問を避けることができます。 –

+0

良い点...実際に私のGAMEパッケージは、1つしかないことを保証するために従来のシングルトンを実装しています... – pitosalas

答えて

4

this answerに記載されているように、静的メソッドまたはフィールドのジェネリック型パラメータにはアクセスできません。静的フィールドはクラスのすべてのインスタンスで共有されるため(この場合、クラスはモデル)、Model<Sprites, Bodies>Model<ClassA, ClassB>はどのように同時に動作しますか?

+0

これは完璧な意味があります...それはなぜ静的な世界がコンパイルに失敗したかを説明します。しかし、どのように世界はそれを離れて得るのですか? – pitosalas

+0

@pitosalas '? 'は「任意の型」を意味するワイルドカードです。したがって、この場合の 'World 'は 'World'を書くようなもので、' Model 'の型パラメータに制約されません(これはコンパイルエラーの原因であったことに注意してください)。 –

+0

このような状況で世界を書くことは醜いと思うのですか、それとも完全にきれいですか?それはまた、警告で受け入れられているプレーンな世界を書くよりも醜いのですか? – pitosalas

2

確かにシングルトンが必要な場合は、その単一インスタンスで参照されている正確なタイプが何であるかを事前に把握しておく必要があります。

例に詳細を追加すると、これはもはや真ではありませんが、私が見る限り、ここにジェネリックは必要ありません。 SpritesBodiesというフィールドをこれらのクラスのサブクラスにすることができます。これらのフィールドをこれらの型で宣言するだけで、継承によって残りの部分が処理されます。

"ジェネリックス"という名前は、さまざまなコンテキストで何度も何度も再利用されるものに使用されます。ツリー構造を定義するクラスのように、オブジェクトの任意のクラスを保持することができます。ジェネリック医薬品が必要かどうかを判断するのが難しい場合もあります。しかし、シングルトンは正反対です。シングルトンよりも汎用性の低いものはありません.1つのクラス、単一のインスタンスです。

P.S.:Enumがありますが、これは一般的であり、固定数のインスタンスを持っていますが、self-bound generic typesが解決策ですが、ほとんど必要ありません。

+0

はい、私は前を知っています...しかし、ジェネリック医薬品の使用につながる他の理由があります多くの厄介なキャスティングを避けながら、パッケージの分離をリーク防止に保ちます。実際、このモデルは別のStackOverflowスレッドから来ています:http://stackoverflow.com/questions/9270466/java-generics-having-trouble-with-a-tricky-situation/9280277#9280277 – pitosalas

+0

@pitosalas多分もっと大きなコードサンプルと少しの説明は、私たちがあなたが必要とするソリューションを特定するのに役立ちます。それが立っているように、あなたの質問に対する答えは、静的フィールドをパラメトリックにすることができないということです。 – biziclop

+0

長いコードサンプルでこのリストに負担をかけることを躊躇しています...私は叩かれたくありません:) – pitosalas

関連する問題