java:HashMap <String、int>が機能しない


128

HashMap<String, int>動作していないようですが、HashMap<String, Integer>動作します。何かアイデアはありますか?


あなたの質問に対するあなたの言葉の選択は紛らわしいです、あなたは明確にできますか?そして、何が機能していないのか、コードを投稿できますか?
Anthony Forloney 2009年

回答:


203

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");

3
最後の例は機能しません:Map <String、Integer>からMap <Integer、String>にキャストできません
T3rm1

新しい行の各個別のコードを考慮すると、行5のコードは、get()メソッドを使用するときにオブジェクトと見なされるため、intValue()メソッドを使用する前に、まずIntegerにキャストする必要があります。
初心者向け学習者


2

でプリミティブ型を使用することはできませんHashMapint、または機能doubleしません。その囲みタイプを使用する必要があります。例として

Map<String,Integer> m = new HashMap<String,Integer>();

これで両方がオブジェクトになるため、これは機能します。


0

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];

-3

参照型は、プリミティブ型ではなく、ジェネリック引数で使用できます。だからここではあなたが使うべきです

Map<String, Integer> myMap = new HashMap<String, Integer>();

そして値を

myMap.put("abc", 5);

1
これは質問の答えにはなりません
smac89 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.