変数hash1
として宣言できるHashMap<String, ?>
ことは、変数hash1
が任意HashMap
のキーString
と任意のタイプの値を持つ任意のものを保持できることを示します。
HashMap<String, ?> map;
map = new HashMap<String, Integer>();
map = new HashMap<String, Object>();
map = new HashMap<String, String>();
変数 map
はこれらのハッシュマップのいずれかを格納できるため、上記のすべてが有効です。その変数は、それが保持するハッシュマップのValueタイプが何であるかを気にしません。
ただし、ワイルドカードを使用しても、マップに任意のタイプのオブジェクトを配置することはできません。実際のところ、上記のハッシュマップでは、map
変数を使用して何も入れることができません。
map.put("A", new Integer(0));
map.put("B", new Object());
map.put("C", "Some String");
上記のすべてのメソッド呼び出しは、Javaが内部のHashMapのValueタイプが何であるかを認識していないため、コンパイル時エラーになりますmap
。
それでもハッシュマップから値を取得できます。「値の型がわからない」(変数内のハッシュマップの種類がわからないため)が、すべてがサブクラスでObject
あり、マップから取得するものは何でもあると言えます。タイプObjectになります:
HashMap<String, Integer> myMap = new HashMap<>();// This variable is used to put things into the map.
myMap.put("ABC", 10);
HashMap<String, ?> map = myMap;
Object output = map.get("ABC");// Valid code; Object is the superclass of everything, (including whatever is stored our hash map).
System.out.println(output);
上記のコードブロックは、コンソールに10を出力します。
したがって、最後に、HashMap
ワイルドカード付きのa を使用して、タイプが何であるかを気にしない場合(つまり、問題ではない場合)HashMap
に、次に示します。
public static void printHashMapSize(Map<?, ?> anyMap) {
// This code doesn't care what type of HashMap is inside anyMap.
System.out.println(anyMap.size());
}
それ以外の場合は、必要なタイプを指定します。
public void printAThroughZ(Map<Character, ?> anyCharacterMap) {
for (int i = 'A'; i <= 'Z'; i++)
System.out.println(anyCharacterMap.get((char) i));
}
上記のメソッドでは、マップのキーがであることを知る必要がありますCharacter
。そうでなければ、マップから値を取得するために使用するタイプがわかりません。toString()
ただし、すべてのオブジェクトにはメソッドがあります。そのため、マップはその値に対して任意のタイプのオブジェクトを持つことができます。それでも値を印刷できます。