Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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 在abstractmap类中,为什么remove()不显示UnsupportedOperationException?_Java_Dictionary_Collections - Fatal编程技术网

Java 在abstractmap类中,为什么remove()不显示UnsupportedOperationException?

Java 在abstractmap类中,为什么remove()不显示UnsupportedOperationException?,java,dictionary,collections,Java,Dictionary,Collections,我正在读[AbstractMap][1]的代码,我看到了 public V More ...put(K key, V value) { throw new UnsupportedOperationException(); } put()方法引发异常 而remove()有一个很大的实现。并且不会引发此异常 有人能解释为什么会有这种偏见吗?默认的remove操作只是在条目集上迭代,而不是很聪明删除可以“始终”1以这种方式实现,即使速度非常慢 put始终需要知道精确的实施细

我正在读
[AbstractMap][1]
的代码,我看到了

 public V More ...put(K key, V value) {
        throw new UnsupportedOperationException();
    }
put()方法引发异常

而remove()有一个很大的实现。并且不会引发此异常


有人能解释为什么会有这种偏见吗?

默认的
remove
操作只是在条目集上迭代,而不是很聪明<代码>删除可以“始终”1以这种方式实现,即使速度非常慢

put
始终需要知道精确的实施细节,包括地图是否可修改

对于不可修改的映射,迭代器不支持
remove
,尽管这似乎不平衡



1只有当迭代器支持删除时,这才是正确的,就像文档状态一样。

默认的
remove
操作只是在条目集上迭代,而不是巧妙地执行<代码>删除可以“始终”1以这种方式实现,即使速度非常慢

" If such an entry is found, its value is
 * obtained with its <tt>getValue</tt> operation, the entry is removed
 * from the Collection (and the backing map) with the iterator's
 * <tt>remove</tt> operation, and the saved value is returned."
put
始终需要知道精确的实施细节,包括地图是否可修改

对于不可修改的映射,迭代器不支持
remove
,尽管这似乎不平衡


1只有当迭代器支持删除时,这才是真的,如文档状态所示。

“如果找到这样的条目,其值为
" If such an entry is found, its value is
 * obtained with its <tt>getValue</tt> operation, the entry is removed
 * from the Collection (and the backing map) with the iterator's
 * <tt>remove</tt> operation, and the saved value is returned."
*通过其getValue操作获得,该条目将被删除 *使用迭代器的 *删除操作,并返回保存的值。“
请看它所说的删除操作是通过迭代器删除操作进行的。我假设,如果基础映射实现是不可变的,它将从迭代器移除方法中抛出unsupportedexception。

“如果找到这样一个条目,则其值为
*通过其getValue操作获得,该条目将被删除
*使用迭代器的
*删除操作,并返回保存的值。“

请看它所说的删除操作是通过迭代器删除操作进行的。我假设,如果基础映射实现是不可变的,它将从迭代器移除方法中抛出不支持的异常。

抽象映射类被设计为读写和只读映射的基础

必须实现getter,因此实现使用抽象方法
entrySet
。但是,如果映射是只读的,
put
可能保持未实现。文件说:

为了实现一个可修改的映射,程序员必须另外重写这个类的
put
方法(否则会抛出一个
UnsupportedOperationException
),并且
entrySet()返回的迭代器。迭代器()
必须另外实现它的
remove
方法

注意,设计者可能没有实现
put
方法,要求程序员显式重写它。但是,所有只读实现都必须提供相同的实现(即抛出
UnsupportedOperationException
),因此设计者选择将此实现放在共享代码库中


另一方面,
remove
方法可以根据派生类必须实现的现有操作来实现,因此Java库中的实现是非空的。它假设
entrySet().iterator()
实现了它的
remove
——如果它没有实现,
AbstractMap
的remove将抛出迭代器的
remove
抛出的任何异常,据推测,
UnsupportedOperationException

AbstractMap
类被设计为读写和只读映射的基础

必须实现getter,因此实现使用抽象方法
entrySet
。但是,如果映射是只读的,
put
可能保持未实现。文件说:

为了实现一个可修改的映射,程序员必须另外重写这个类的
put
方法(否则会抛出一个
UnsupportedOperationException
),并且
entrySet()返回的迭代器。迭代器()
必须另外实现它的
remove
方法

注意,设计者可能没有实现
put
方法,要求程序员显式重写它。但是,所有只读实现都必须提供相同的实现(即抛出
UnsupportedOperationException
),因此设计者选择将此实现放在共享代码库中


另一方面,
remove
方法可以根据派生类必须实现的现有操作来实现,因此Java库中的实现是非空的。它假设
entrySet().iterator()
实现了它的
remove
——如果它没有实现,
AbstractMap
的remove将抛出迭代器的
remove
抛出的任何异常,大概是
UnsupportedOperationException

@Thinker大概是迭代器不支持
remove
@Thinker大概是迭代器不支持
remove
。你不能创建一个抽象映射,只能创建一个子类来覆盖这些方法就是说,
remove
可以通过其他操作来实现,而
put
不能。你不能创建一个抽象映射,只能创建一个子类来覆盖这些方法。“偏差”就是,
remove
可以通过其他操作来实现,而
put
不能。