2017-12-13 10 views
0

私は、オブジェクトのProcessorを格納できるprocessorsマップを格納しようとしているJava Genericsの例を以下に示します。私はProcessorクラスのジェネリック型を追加しました。私は地図processorsをそのキークラス 'Processorオブジェクトのみを値として保存するように制限します。 Javaワイルドカードを使用する方法、またはprocessorsコレクションにバインドする方法はありますか?マップ自体には、異なるクラスの複数のオブジェクトをキーに格納できることに注意してください。javaジェネリックスインスタンス変数の限定コレクション

public class GenericsExample { 

    private Map<?, Processor<?>> processors = new HashMap<>(); 

    public <O> void parameterisedMethod(O o) { 
     processors.put(o, new Processor<O>()); 
    } 

    static class Processor<T> { 
     void process(T t) { 
      System.out.println(t + " processed."); 
     } 
    } 

    public static void main(String[] args) { 
    } 
} 
+2

Javaタイプシステムでは、対応を強制する方法はありません。あなたはキャストを強制することができますが、それはあなたが得ることができるほど良いです。 –

+0

ありがとうございます。 –

答えて

1

@LouisWassermanは彼のコメントで述べたように、javaのマップのキーと値の型を一致させることはできません。

これを実装するには、マップの宣言でキータイプのために代わりにワイルドカードのObjectを使用する必要があります。

private Map<Object, Processor<?>> processors = new HashMap<>(); 

コンパイラは、今あなたがマップ内の任意の関連するプロセッサを持つ任意のキーを挿入できるようになります。これは、一致するタイプが挿入されることを可能にするだけのお仕事です:

<T> void addProcessor(T instance, Processor<? super T> processor) { 
    processors.put(instance, processor); 
} 

マップからの読み取り時に型の安全性の錯覚を作成するには、明示的なキャストが必要になります。おそらく一部の@SuppressWarning("unchecked")注釈。例:

@SuppressWarnings("unchecked") 
<T> Processor<T> getProcessor(T instance) { 
    return (Processor<T>) processors.get(instance); 
} 
0

一緒にパラメータとそのプロセッサを保持するためにParamAndProcessor<T>クラスを作成します。

class ParamAndProcessor<T> { 
    T param; 
    Processor<T> processor; 

    // Ctor. 

    void process() { 
    processor.process(param); 
    } 
} 

次にマップでこののインスタンスを格納します。

Map<Object, ParamAndProcessor<?>> processors; 

public void parameterisedMethod(Object o) { 
    processors.put(o, new Processor<>()); 
} 

をあなたが入れたい場合は何でもprocessorsに入れると、キータイプとして?を持つことはできません。

parameterizedMethodは実際にパラメータ化する必要はありません。 (Processorクラスは、少なくともあなたが示したものではありません)。

関連する問題