1

Java で Map を使用する必要があります。integer、boolean、long など、任意のタイプの値を指定できます。これは私が持っているものです:

Map<String, ?> prefs = Preferences.GetPrefs();

// Now I would like to use it to add new values...
prefs.put("Hi", true); // <-- error

どのように使用できますか?ありがとう

4

3 に答える 3

5

prefs2 番目のジェネリック型引数を含むメソッドを呼び出すことはできません。これは、その型がコンテキストで不明であるためです。戻り値の型の背後にある意図Map<String ?>は、「このマップは呼び出し元によって変更されるべきではない」ということです。

Map<String, ?>明確な型ではなく、明確な型が一致するテンプレートとして読む必要があります。具体的には、「タイプされたキーMap<String, ?>を持つそのようなマップ」を表します。Stringたとえば、Map<String, Integer>このテンプレートに一致し、変数に割り当てることができます。明らかに、Stringそのようなマップに値を設定することは許可されていません。

メソッドが修正された場合、唯一の手段は、チェックされていないキャストを明確なジェネリック型GetPrefsに強制し、型の安全性を失うことです。Map<String,Object>

それ以外の場合、クラスを制御している場合は、状況に応じて、Preferencesそのメソッドの戻り値の型を に変更します。Map<String, Object>

于 2013-11-07T10:05:30.660 に答える
3

については?、コレクションに型があることを意味しますが、それが何であるかはわかりません。つまり、(不明な) コレクション型と一致しない可能性があるため、コレクションに値を入れることはできません。

理由の例として、次のコードを検討してください。

Map<String, String> a = new HashMap<String, String>();
Map<String, ?> b = a;
a.put("bar", "baz"); // This is fine: Normal use
b.put("foo", 25); // This won't compile

String baz = a.get("bar"); // Returns the string "baz"
String twentyfive = a.get("foo"); // Return type is String, but the map would contain an Integer.  Run-time exception.
于 2013-11-07T10:09:08.920 に答える
3

オブジェクトを使用

Map<String, Object> prefs = Preferences.GetPrefs();

次にフェッチする

Boolean result = (Boolean)prefs.get("Hi"); 
于 2013-11-07T10:01:52.507 に答える