回答:
Javaでは、プリミティブ型をジェネリック引数として使用することはできません。代わりに使用:
Map<String, Integer> myMap = new HashMap<String, Integer>();
オートボクシング/アンボクシングのコードにはほとんど違いがあります。自動ボクシングとは、次のように記述できることを意味します。
myMap.put("foo", 3);
の代わりに:
myMap.put("foo", new Integer(3));
自動ボックス化とは、最初のバージョンが暗黙的に2番目のバージョンに変換されることを意味します。自動ボックス化解除では、次のように記述できます。
int i = myMap.get("foo");
の代わりに:
int i = myMap.get("foo").intValue();
暗黙的な呼び出しintValue()
は、キーが見つからない場合にを生成することを意味します。NullPointerException
次に例を示します。
int i = myMap.get("bar"); // NullPointerException
理由は型消去です。たとえば、C#とは異なり、ジェネリック型は実行時に保持されません。これらは、明示的なキャストでこれを実行する手間を省くための単なる「構文上の砂糖」です。
Integer i = (Integer)myMap.get("foo");
例を挙げれば、このコードは完全に合法です。
Map<String, Integer> myMap = new HashMap<String, Integer>();
Map<Integer, String> map2 = (Map<Integer, String>)myMap;
map2.put(3, "foo");
GNU Troveはこれをサポートしていますが、ジェネリックスは使用していません。http://trove4j.sourceforge.net/javadocs/gnu/trove/TObjectIntHashMap.html
でプリミティブ型を使用することはできませんHashMap
。int
、または機能double
しません。その囲みタイプを使用する必要があります。例として
Map<String,Integer> m = new HashMap<String,Integer>();
これで両方がオブジェクトになるため、これは機能します。
intはプリミティブ型であり、Java でのプリミティブ型の意味をここで読み取ることができます。Map は、オブジェクトとして入力する必要があるインターフェースです。
public interface Map<K extends Object, V extends Object>
オブジェクトはクラスを意味し、それから拡張する他のクラスを作成することもできますが、intから拡張するクラスを作成することはできません。したがって、int変数をオブジェクトとして使用することはできません。私はあなたの問題の解決策を2つ持っています:
Map<String, Integer> map = new HashMap<>();
または
Map<String, int[]> map = new HashMap<>();
int x = 1;
//put x in map
int[] x_ = new int[]{x};
map.put("x", x_);
//get the value of x
int y = map.get("x")[0];
参照型は、プリミティブ型ではなく、ジェネリック引数で使用できます。だからここではあなたが使うべきです
Map<String, Integer> myMap = new HashMap<String, Integer>();
そして値を
myMap.put("abc", 5);