我想不出一个更好的名字来描述这个问题,但我希望一个例子能让这个问题变得更简单.

假设我创建了自己的定制List(它做什么并不重要):

    static class MyList<E> extends AbstractList<E> {

        @Override
        public E get(int index) {
            return null;
        }

        @Override
        public int size() {
            return 0;
        }
    }

我现在可以创建它的一个实例,并调用与我所覆盖的方法不同的方法:

MyList<String> myList = new MyList<>();
myList.iterator();

当然,iterator should使用我声明的get方法,但这是保证吗?这是否意味着iterator不能以一种它根本不使用get的方式改变?


举个更简单的例子,你可以考虑addAll个.假设我的MyList也覆盖了add:

   @Override
   public boolean add(E e) {
      return super.add(e); // irrelevant what it does
   }

然后我可以做到:myList.addAll(someOtherCollection).addAll could可以简单地实施:

for(E e: someOtherCollection) {
    // use add that I have overridden
}

但与此同时,实现可以改变,根本不使用循环(例如ArrayList).


诚然,iteratoraddAll在文档中都提到了一些内容,例如:

该实现返回迭代器接口的直接实现,依赖于支持列表的Size()、Get(Int)和Remove(Int)方法.

This implementation iterates over the specified collection, 和 adds each object returned by the iterator to this collection, in turn.

So does that mean that this can NOT change 和 is treated as "specification"? Now that I wrote this long question 和 re-read it, the answer might be an obvious "yes".

推荐答案

AbstractList(JDK21)的Javadoc表示

该类中每个非抽象方法的文档都详细描述了其实现.

所以,是的,这是规范的一部分.

Java相关问答推荐

我们如何直接使用kerminldap服务票证来通过ldap进行身份验证并形成LDAP上下文

在FML中删除关键帧动画

try 使用Java 9或更高版本对特殊对象图进行解析时出现NullPointerException

如何在访问完所有文件后加入所有线程?

在Java Stream上调用collect方法出现意外结果

有没有一种方法使保持活动设置专用于java.net.http.HttpClient的一个实例

Java FX中的河内之塔游戏-在游戏完全解决之前什么都不会显示

Java 21虚拟线程执行器的性能比池化操作系统线程的执行器差?

Java编译器抛出可能未正确初始化的错误?

如何在Java记录中设置BigDecimal类型属性的精度?

带错误BER验证的itext8签名返回pdf

为什么Spring Boot项目无法为基于MySQL的CRUD应用程序找到从JPARepository接口扩展的ProductRepository?

使用Jolt将字段转换为列表

使SLF4J在Android中登录到Logcat,在测试中登录到控制台(Gradle依赖问题)

解析方法";javax/imageio/metadata/IIOMetadata.getAsTree(Ljava/lang/String;)Lorg/w3c/dom/Node时加载约束冲突

在应用getCellFormula()时,Excel引用中的文件名始终为";[1]";使用Apache POI()

Intellij 2023 IDE:始终在顶部显示菜单栏

ResponseEntity.控制器截断响应的JSON部分

使用Java线程进行并行编程

如何使用Jackson读取以方括号开头的JSON?