1

理由を定義すると、次のMap<K,V> map = new HashMap<K, V>()ようなことができなくなります。

map.put(new MyKey<CustomObject>(), new SomeOtherObject<CustomObject>());

しかし、私が別の方法でそれを行う場合、それは機能します:すなわち:

add(new MyKey<CustomObject>(), new SomeOtherObject<CustomObject>());  

public <K, V> void add(K k, V v){  
        Map<K, V> threadLocalMap = new HashMap<K, V>();  
        threadLocalMap.put(k, v);  
}  
4

3 に答える 3

3

マップで使用されるタイプを明示的に宣言する必要があります。

Map<MyKey,SomeOtherObject> map = new HashMap<MyKey, SomeOtherObject>();
map.put(new MyKey<CustomObject>(), new SomeOtherObject<CustomObject>());

2番目の例では、addメソッドはジェネリックであるため、呼び出すと、KとVは、呼び出し元のコードで使用されている実際の型に置き換えられます。

編集

あなたはの意味を誤解しているようですMap<K, V>。KとVには特定の意味はありません。これらは、特定のタイプのキーと特定のタイプの値のみを受け入れるようにマップを「パラメーター化」できることを示しているだけです。ただし、これらのタイプを定義するのはユーザーの責任です。

最初の例ではMyKey、キー(K)とSomeOtherObject値( )のタイプとして使用しますV。したがって、これらのタイプの特定のマップを作成する必要がありますMap<MyKey,SomeOtherObject> map = new HashMap<MyKey, SomeOtherObject>();

Map<K, V>KとVはコンパイラにとって何の意味もないので、単純に書くことはできません(KというクラスとVというクラスを作成していない限り、作成していないと思います)。

2番目の例では、タイプKとVの2つのパラメーターを受け取るジェネリックメソッドを使用します。メソッドが呼び出されると、KとVは実際に受信したタイプに置き換えられるため、例のコードは非常に何かに変換されます。私の答えの上部にあるコードに似ています。

これが物事を明らかにすることを願っています。ジェネリックに関するチュートリアルを読んで、具体的な例を見てみることをお勧めします。

于 2012-09-14T11:31:12.953 に答える
1

それはそれがどのように機能するかではありません:クラスはジェネリックですが、インスタンスは特定でなければなりません。

インスタンス化時にマップを使用できるクラスを指定します。

Map<SomeClass, SomeOtherClass> myMap = new HashMap<SomeClass, SomeOtherClass>();

完全に汎用的なインスタンスが必要な場合は、次を使用します。

Map myMap = new HashMap();

つまり...「ジェネリック」はありません。

于 2012-09-14T11:30:10.573 に答える
0

他の回答で述べたように、インスタンスはKとVが何であるかについて具体的である必要があります(これがジェネリックのポイントです-必要なものを追加できるようにしたい場合は、Mapジェネリックなしでaを使用します。またはMap<Object, Object>)。ただし、複数のカスタムクラスを追加できるようにするためにできることは、それらすべてに基本クラスを拡張させ、マップをに設定することMap<MyKeyBaseClass, MyValueBaseClass>です。キーまたは値のいずれかが何でもかまいませんが、Object代わりに使用してください。ジェネリックスの目的が実際に受け入れるオブジェクトの範囲を広げることではなく、狭くすることであると考えると、より簡単に感じるかもしれません。

編集:ジェネリックスの基本原則に問題があるようです。ジェネリックスに関するJavaチュートリアルを読むことをお勧めします。

于 2012-09-14T11:34:57.437 に答える