Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当clear()方法调用抛出UnsupportedOperationException时,如何清除映射的内容?_Java_Exception_Collections - Fatal编程技术网

Java 当clear()方法调用抛出UnsupportedOperationException时,如何清除映射的内容?

Java 当clear()方法调用抛出UnsupportedOperationException时,如何清除映射的内容?,java,exception,collections,Java,Exception,Collections,如果在调用映射实例上的clear()方法时,我一直得到UnsupportedOperationException,如何清空映射内容 如果映射是一个不可修改的映射(例如,从中获取),那么除了创建一个新引用并清除它之外,您几乎不能(也应该)修改它 Map unmodifiable = Collections.unmodifiableMap(m); Map newMap = new HashMap(unmodifiable); newMap.clear(); unmodifiable = newMap

如果在调用映射实例上的
clear()
方法时,我一直得到
UnsupportedOperationException
,如何清空映射内容

如果
映射
是一个
不可修改的映射
(例如,从中获取),那么除了创建一个新引用并清除它之外,您几乎不能(也应该)修改它

Map unmodifiable = Collections.unmodifiableMap(m);
Map newMap = new HashMap(unmodifiable);
newMap.clear();
unmodifiable = newMap;
也就是说,实际上可以修改
不可修改的映射。事实证明,这不过是一个实现
Map
接口并包装实际
Map
的类。它在包装的
Map
上为其只读方法委派,并在其改变Map的方法实现中抛出
UnsupportedOperationException
s。可以通过反射获得包装的
映射
,并对其进行修改

免责声明:请注意,使用时必须格外小心。如果不可修改的地图是由图书馆或类似机构提供的,它可能会对其性质做出假设,违反其合同可能会导致意外/不期望的结果。此外,这可能依赖于内部结构,这些内部结构可能会在未经通知的情况下更改,或者在不同版本之间有所不同

// Creates a standard map
Map<String, String> myMap = new HashMap<String, String>();
myMap.put("1", "a");
myMap.put("2", "b");
// Creates an unmodifiableMap. Actually a wrapper for myMap.
Map unmodifiableMap = Collections.unmodifiableMap(myMap);
System.out.println("Size of unmodifiable map is: " + unmodifiableMap.size());
try{
    // Get classes declared in java.util.Collections
    Class[] classes = Collections.class.getDeclaredClasses();
    for(Class cl : classes) {
        // Look for the UnmodifiableMap class
        if("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {
            // The wrapped Map is in an attribute called "m"
            Field field = cl.getDeclaredField("m");
            field.setAccessible(true);
            // Get the wrapped map
            Object obj = field.get(unmodifiableMap);
            Map map = (Map) obj;
            // modify it
            map.clear();
        }
    }
}
catch (Exception e){ System.out.println(); }
System.out.println("Size of unmodifiable map is: " + unmodifiableMap.size());
//创建标准映射
Map myMap=newhashmap();
myMap.put(“1”、“a”);
myMap.put(“2”、“b”);
//创建不可修改的映射。实际上是myMap的包装器。
Map unmodifiableMap=Collections.unmodifiableMap(myMap);
System.out.println(“不可修改映射的大小为:”+unmodifiableMap.Size());
试一试{
//获取java.util.Collections中声明的类
Class[]classes=Collections.Class.getDeclaredClasses();
对于(类别cl:类别){
//查找UnmodifiableMap类
if(“java.util.Collections$UnmodifiableMap”.equals(cl.getName())){
//包装的映射位于名为“m”的属性中
字段字段=cl.getDeclaredField(“m”);
字段。setAccessible(true);
//把地图包起来
Object obj=field.get(不可修改的映射);
Map Map=(Map)obj;
//修改它
map.clear();
}
}
}
catch(异常e){System.out.println();}
System.out.println(“不可修改映射的大小为:”+unmodifiableMap.Size());

(归功于)

你不应该。协作对象及其方法的契约中存在错误。您需要一个可修改的地图,但得到的是一个不可修改的视图。您应该重新定义契约和/或相应地采用任何实现。如果您无法控制正在向您传递该地图的人,那么它向您传递不可修改的视图可能是有原因的。

显然,该地图不支持此操作。创建一个新的映射。可能是一个不可修改的映射,他们希望指示您需要不同的逻辑,使用您自己的映射填充该映射。检查映射实现的.clear()代码。如果可以的话,把它贴出来。