Java - Вставить карту

Как я могу использовать Map<Object,Object> до Map<String,String> самым чистым способом?

Есть ли способ сделать это без итерации над картой?

Спасибо

Ответы

Ответ 1

Я думаю, что это хорошая идея, чтобы объяснить, почему простое решение не работает и почему вы никогда не должны его использовать.

Предположим, вы можете применить List<Object> к List<String> (то же самое относится к Map, просто более простой интерфейс). Что вы ожидаете от следующего кода:

List<Object> m = Something;
m.add("Looks good.");
m.add(42);
List<String> s = (List<String>)m; // uhuh, no we don't want that.
String myString = s.get(1); // huh exception here.

Теперь вы можете взломать его действительно с помощью решения Bohemians/Chris, но вы в основном уничтожаете систему типа Java. НЕ ДЕЛАЙТЕ ЭТО.. Вы не хотите, чтобы List<String> содержал Integer! Получите удовольствие от отладки, которая позже - дополнительный код цикла через все переменные позволит избежать множества головных болей и вряд ли это проблема производительности.

Если есть причина объявить Map как объект, а не String, кто-то может добавить к нему какой-либо объект - обычно вы должны избегать этого с лучшим общим.

Ответ 2

Фактический ответ:

Map<Object,Object> valueMap = ...;
@SuppressWarnings("unchecked")
Map<String,String> targetMap = (Map)valueMap;

Ответ 3

Основываясь на Chris J answer, здесь его "взломать" код в действии, показывая, что он работает:

public static void main(String[] args) {
    Map<Object, Object> valueMap = new HashMap<Object, Object>();
    valueMap.put("foo", "bar");
    @SuppressWarnings("unchecked")
    Map<String, String> targetMap = (Map<String, String>) ((Object) valueMap); // hack alert!
    for (Map.Entry<String, String> entry : targetMap.entrySet()) {
        String key = entry.getKey();
        String value = entry.getValue();
        System.out.println(key + "=" + value); // prints foo=bar :)
    }
}

Ничего себе! Исключения не выполняются:)