Избегание неконтролируемого броска для глубокого копирования карты - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь реализовать метод deepCopy для многозначной карты следующим образом:

public static <K, V> ListValuedMap<K, V> deepCopy (ListValuedMap<K, V> a) {
    ListValuedMap<K, V> result = new ArrayListValuedHashMap<>();
    a.asMap().forEach((key, value) -> {
        Object newValue;
        if (value instanceof ListValuedMap) {
            newValue = deepCopy((ListValuedMap<K, V>) value);
                                 ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ 
                                    unchecked cast!

        } else if (value instanceof Cloneable) {
            try {
                Method clone = value.getClass().getDeclaredMethod("clone");
                newValue = clone.invoke(value);
            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                throw new RuntimeException(e);
            }
        } else {
            newValue = value;
        }
        result.put(key, (V) newValue);
                        ‾‾‾       
                  unchecked cast !
    });
    return result;
}

Второго непроверенного приведения можно избежать, передав класс для аргумента параметра-параметра типа V и используя vClass.cast(newValue), но я понятия не имею, как поступить с первой ошибкой.

...