首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在使用List迭代器的next方法时会出现不兼容的类型错误,而在使用List的get方法时却不会呢?

在使用List迭代器的next方法时会出现不兼容的类型错误,而在使用List的get方法时却不会,是因为它们在处理元素类型的方式上有所不同。

List是一个有序的集合,可以通过索引来访问其中的元素。List的get方法通过索引获取元素,返回的是指定位置的元素对象。由于List在创建时需要指定元素的类型,因此在编译时就已经确定了元素的类型,所以在使用get方法时不会出现类型错误。

而List迭代器是用于遍历List集合的工具,它提供了一系列的方法来访问集合中的元素。在使用迭代器的next方法时,它返回的是一个Object类型的对象,而不是具体的元素类型。这是因为迭代器设计的初衷是为了能够处理各种类型的集合,而不仅仅局限于某一种类型。因此,在使用迭代器的next方法获取元素时,需要将返回的Object对象强制转换为实际的元素类型。如果在强制转换的过程中出现了类型不兼容的情况,就会抛出类型错误。

综上所述,使用List的get方法获取元素时不会出现类型错误,是因为在编译时已经确定了元素的类型;而使用List迭代器的next方法获取元素时可能会出现类型错误,是因为迭代器返回的是Object类型的对象,需要进行强制类型转换。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ArrayList循环中删除元素,会不会出现问题?

) { // list.remove(iterator.next()); // } // } // 方法五:迭代使用迭代...} // } } } 这里我测试了五种不同删除方法,一种是普通 for 循环,一种是增强 foreach 循环,还有一种是使用迭代循环,一共这三种循环方式。...删除这种元素方法删除重复但不连续元素是正常,但在删除重复且连续元素,会出现删除不完全问题,这种删除方式也是用到了 ArrayList 中 remove() 方法。...方法五中使用迭代 remove() 方法,通过阅读 ArrayList 源码可以发现,有两个私有内部类,Itr 和 ListItr,Itr 实现自 Iterator 接口,ListItr 继承...中 remove() 方法,那为什么方法四会抛出并发修改异常而这里就没有问题

3K20

【Java 基础 - 泛型机制详细解释】

为什么会引入泛型 泛型本质是为了参数化类型创建新类型情况下,通过泛型指定不同类型来控制形参具体限制类型)。...list.add(new Person()); 我们使用上述list中,list元素都是Object类型(无法约束其中类型),所以取出集合元素需要人为强制类型转化到具体目标类型,且很容易出现...当然,泛型方法不是仅仅可以有一个参数Class,可以根据需要添加其他参数。 为什么使用泛型方法?...调用泛型方法,可以指定泛型,也可以指定泛型: 指定泛型情况下,泛型变量类型为该方法几种类型同一父类最小级,直到Object 指定泛型情况下,该方法几种类型必须是该泛型实例类型或者其子类...既然类型擦除了,如何保证我们只能使用泛型变量限定类型? Java编译是通过先检查代码中泛型类型,然后进行类型擦除,再进行编译。

46310
  • 三种骚操作绕过迭代遍历时数据修改异常

    导致这个报错出现原因就和我们操作一样,对于某些集合,建议遍历时进行数据修改,因为这样会数据出现不确定性。 那么如何绕过这个错误?这篇文章中脑洞大开三种方式一定不会让你失望。...而上面与 modCount 进行对比字段 expectedModCount 值,其实是创建迭代,从 modCount 获取值。如果列表结构没有被修改过,那么两者值应该是一致。...可以看出来是先运行了迭代 next 方法,然后才运行了System.out 进行输出。...所以第二种思路是先把第三个元素C++ 更新为Java ,然后启动一个线程,迭代再次调用 next 方法后,把第四个元素移除掉。这样就输出了我们想要结果。...绕过方式三:利用类型擦除放入魔法对象 创建集合时候为了减少错误概率,我们会使用泛型限制放入数据类型,其实,泛型限制集合在运行时也是没有限制,我们可以放入任何对象。

    58730

    Java泛型深入理解「建议收藏」

    我们介绍泛型指出向ArrayList中插入String类型对象,编译时会报错。现在为什么又可以了?...泛型方法类型推断 调用泛型方法时候,可以指定泛型类型,也可以指定。 指定泛型类型情况下,泛型类型为该方法几种参数类型共同父类最小级,直到Object。...编译在编译擦除了所有类型相关信息,所以在运行时不存在任何类型相关信息。例如List在运行时仅用一个List类型来表示。为什么要进行擦除?这是为了避免类型膨胀。 3....extends Number> list2=new ArrayList(); 假设前面的例子没有编译错误,如果我们把list1或者list2传入方法fillNumberList,显然都会出现类型匹配情况...如果说,T为Number父类,我们想List中加入Number子类肯定是可以。 非法使用List进行迭代是不允许为什么

    80420

    重学Java之泛型基本使用

    幸运是,一些bug更容易发现相对其他类型bug,例如,编译bug可以早期发现; 你可以使用编译给出错误信息来找出问题所在,然后在当时就解决它。...我一开始用是JDK 8,使用这个版本时候,泛型已经进入Java十年了,泛型对于我来说是很理所当然,就像鱼习惯了水一样。那Java为什么要引入泛型?...编译进行更强类型检查,编译会对使用了泛型代码进行强类型检查,如果类型不安全,就会报错。编译错误会比运行时错误,容易修复和查找。 Elimination of casts....这里来讲下我理解,一般方法需要参数,调用方没有提供,编译不通过。为什么泛型没有引入此设计传递类型参数,那不通过编译不是更好嘛。那让我们回忆一下,泛型是从JDK哪个版本开始引入?...总结一下Java为什么要引入泛型,原因大致有这么几个: 增强代码复用性、让错误在编译时候就显现出来。

    36910

    深入理解 Java 泛型

    > c = Lists.newArrayList(new Object()); Object o = c.get(0); c.add("12"); // 编译错误 为什么会编译报错?...我们可以将任意类型集合赋值给List c变量。但是,add方法参数类型是?,它表示未知类型,所以调用add方法时会编程错误,这是一种安全做法。...而get方法返回集合中元素,虽然集合中元素类型未知,但是无论是什么类型,其均为Object类型,所以使用Object类型来接收是安全。.../代码3,编译错误 } 代码3为什么会编译错误?..., add 发现类型不一致立刻报错,而不是继续运行可能存在问题程序 类型擦除(Type Erasure) 我们知道,编译会将泛型擦除,那怎么理解泛型擦除

    58930

    Java 集合源码解析(1):Iterator

    Enumeration 接口早在 JDK 1.0 就推出了,当时比较早容器比如 Hashtable, Vector 都使用它作为遍历工具。 那 Enumeration 为什么会被废弃?...注意这个 [语法正确],事实上我们使用 Iterator 对容器进行迭代如果修改容器 可能会报 ConcurrentModificationException 错。...fail-fast 与 ConcurrentModificationException 以 ArrayList 为例,调用迭代 next,remove 方法: public E next...不过意外发现了,原来 for-each 循环内部也是使用了 Iterator 来遍历Collection,它也调用了 Iterator.next(),所以修改元素时会检查(元素)变化并抛出 ConcurrentModificationException...差点忘了 Iterator 使用 所有 Collection 子类都有 iterator() 方法来获得 Iterator,通过 Iterator 标准操作方法,可以让我们不必关心具体集合类型

    94850

    详解 Java 泛型

    时会发生什么情况?我们不能再向 list1 这个容器中 add 任何元素了!为什么。...因为编译并不知道实际类型是什么(因为你给了编译一个问号),所以你 add 任何类型对象都会报类型兼容语法错误。有些小伙伴可能会问:把它当成 Object 类型容器就好了啊!...抱歉,编译不会这么做,除非在 “实在没有办法” 情况,例: Object obj = list1.get(0); 为什么把调用 list1 get 方法叫 “实在没有办法” 情况?...因为我代码里面调用了 list1.get(0),这个方法是有返回值,编译必须给返回值给你,否则违反了 Java 基本语法。...// 报类型兼容错误 list.add(new A()); // 报类型兼容错误 list.add(new B()); // 报类型兼容错误 list.add(new C()); // 报类型兼容错误

    91920

    深入理解 Java 泛型

    为什么引入泛型 引入泛型之前,要想实现一个通用、可以处理不同类型方法,你需要使用 Object 作为属性和方法参数,比如这样: public class Generic { private...类型参数意义是告诉编译这个集合中要存放实例类型,从而在添加其他类型做出提示,在编译就为类型安全做了保证。 这种参数类型可以用在类、接口和方法创建中,分别称为泛型类、泛型接口、泛型方法。...> list, int i, int j){ Object o = list.get(i); list.set(j,o); } 这个代码看上去应该是正确,但 Java 编译会提示编译错误...编译提示我们把方法 List 改成 List 就好了,这是为什么? ? 和 Object 不一样吗? 的确因为 ? 和 Object 不一样,List<?...因此泛型只在编译强化它类型信息,而在运行时丢弃(或者擦除)它元素类型信息。擦除使得使用泛型代码可以和没有使用泛型代码随意互用。 3.如果类型参数方法声明中只出现一次,可以用通配符代替它。

    2.1K111

    Python编程中反模式

    为了照顾目标读者,本文做了一些简化(例如:讨论迭代时候忽略了生成器和强大迭代工具itertools)。 对于那些新手开发者,总有一些使用反模式理由,我已经尝试可能地方给出了这些理由。...迭代 range使用 Python编程新手喜欢使用range来实现简单迭代迭代长度范围内来获取迭代每一个元素: for i in range(len(alist)): print...那么什么值可以用来作为哨兵C语言时代或者更早,当int统治编程世界时候,对于需要返回一个期望错误结果函数来说为通用模式为返回-1。...为什么print_file函数里,当一个局部变量filename没有被找到时,下一步是全局作用域中去寻找。...工厂函数可以显式生成list; [2] string.find(str)返回strstring中开始索引值,如果不存在则返回-1; [3] 在外作用于中不要给函数中局部变量名设置任何值,以防止函数内部调用局部变量发生错误而调用外部作用域中同名变量

    1.1K60

    Iterator,fail-fast机制与比较

    p=1185 迭代对于我们搞Java来说绝对陌生。我们常常使用JDK提供迭代接口进行Java集合迭代。...Iterator模式是用于遍历集合类标准访问方法。 它可以把访问逻辑从不同类型集合类中抽象出来,从而避免向客户端暴露集合内部结构。 没有迭代我们都是这么进行处理。...next():返回迭代刚越过元素引用,返回值是Object,需要强制转换成自己需要类型 boolean hasNext():判断容器内是否还有可供访问元素 void remove():删除迭代刚越过元素...所以要保证遍历过程中不出错误,我们就应该保证遍历过程中不会对集合产生结构上修改(当然remove方法除外),出现了异常错误,我们就应该认真检查程序是否出错而不是catch后不做处理。...诚然,迭代快速失败行为无法得到保证,它不能保证一定会出现错误,但是快速失败操作会尽最大努力抛出ConcurrentModificationException异常,所以因此,为提高此类操作正确性而编写一个依赖于此异常程序是错误做法

    72620

    【Java基础】List集合系列

    extends E> c) // 3-返回list集合中指定索引位置元素 E get(int index) // 4-返回list集合中第一次出现o对象索引位置,如果list集合中没有o对象,那么就返回...-1 int indexOf(Object o) // 5-返回此列表元素列表迭代(按适当顺序) ListIterator listIterator() // 6-从指定位置开始,返回此列表元素列表迭代...AbstractList是一个抽象类,它也实现了List接口。 那为什么ArrayList继承它,而不是直接去实现List接口?...往上追溯,可以Collections接口中binarySearch()方法中会判断当前List是否实现了RandomAccess接口,然后再决定使用for循环还是使用迭代形式遍历当前List...transient关键字作用是序列化这个对象,这个属性不会被序列化。 如果对ArrayList感兴趣可以查看我另一篇对ArrayList详解,这篇文章重心介绍List集合。

    30610

    一文读懂《Effective Java》第23条:不要在新代码中使用原生态类型

    泛型出现后,我们通过泛型可以告诉编译每个集合可以接受哪些对象类型,让编译自动为集合元素插入进行转化,并且在编译告知我们是否插入了类型错误对象。...泛型:编译期及早发现错误 使用泛型进行编码,有两个好处: 优点1:让编写代码在编译期及早发现错误,并且助于定位报错位置 优点2:集合使用泛型,从集合中遍历元素不需要再进行手工转换了(编译替我们完成隐式转换...因此代码开发,我们不小心将一个coin 实例放进stamps集合时,编译会及时提醒我们并产生一条编译错误信息,准确告知程序员哪里出现错误。...原生类型与泛型类型区别 其一、使用原生态类型,会失掉泛型安全性和其他表述性方面的优势。 为什么继续允许使用原生态类型?...泛型推荐使用场景 不要在新代码中使用原生态类型,这条规则有两个小小例外,原因是:泛型信息可以在运行时被编译擦除了。

    30720

    Java集合详解3:一文读懂Iterator,fail-fast机制与比较

    Iterator模式是用于遍历集合类标准访问方法。 它可以把访问逻辑从不同类型集合类中抽象出来,从而避免向客户端暴露集合内部结构。 没有迭代我们都是这么进行处理。...迭代与枚举有两点不同: 1、迭代允许调用者利用定义良好语义迭代期间从迭代所指向 collection 移除元素。 2、方法名称得到了改进。...next():返回迭代刚越过元素引用,返回值是Object,需要强制转换成自己需要类型 boolean hasNext():判断容器内是否还有可供访问元素 void remove():删除迭代刚越过元素...所以要保证遍历过程中不出错误,我们就应该保证遍历过程中不会对集合产生结构上修改(当然remove方法除外),出现了异常错误,我们就应该认真检查程序是否出错而不是catch后不做处理。...诚然,迭代快速失败行为无法得到保证,它不能保证一定会出现错误,但是快速失败操作会尽最大努力抛出ConcurrentModificationException异常,所以因此,为提高此类操作正确性而编写一个依赖于此异常程序是错误做法

    93100

    线性表及ArrayListLinkedList源码分析总结

    为什么我们啰里啰嗦为两句代码解释了一堆内容?就是要强调,上面两个步骤顺序是不能颠倒为什么?...这说明——当使用Iterator迭代进行迭代,Iterator并不是把集合元素本身传递给了迭代变量,而是把集合元素额值出给了迭代变量,因此我们在后边进行各种赋值并不影响集合本身元素。...而且子删除集合中元素,我们优先考虑用Iteratorremve()方法,因为他有更高效率,为什么?这里我们先作为一个遗留问题,后面我们再详细证明。   ...也就是说遍历ArrayList使用随机访问(即,通过索引序号访问)效率最高,这点毋庸置疑,使用迭代遍历效率最低(这点是网上答案,由于两者测试结果处于同一个数量级,加上机器误差,这点笔者很难证实...而言,list.get(i)方法是O(N)时间,慢寻址;而他remove()方法确实O(1)

    65540

    Java中泛型详细解析,深入分析泛型使用方式

    泛型基本概念 泛型: 参数化类型 参数: 定义方法时有形参 调用方法传递实参 参数化类型: 将类型由原来具体类型参数化,类似方法变量参数 类型定义成参数形式, 可以称为类型形参 使用或者调用时传入具体类型...,不能是简单类型 不能对确切泛型类型使用instanceof操作,编译时会出错 泛型接口 泛型接口与泛型类定义及使用基本相同 泛型接口常常被用在各种类生产中 示例: // 定义一个泛型接口 public...由此可见: 同一种泛型可以对应多个版本,因为参数类型是不确定 不同版本泛型类型实例是兼容 为了解决这样问题,又不能为了定义一个新方法来处理Generic,这与Java...key; } /* * 下面的这个方法显然是有问题,在编译中就会提示错误"cannot resolve symbol E" * 因为声明中并未声明泛型E,所以使用E...由于JVM擦除机制,在运行时JVM是不知道泛型信息: 所有可以给oa[1] 赋值一个ArrayList却不会出现异常 但是取出数据时候要做一次类型转换,就会出现ClassCastException

    1.1K10

    「源码分析」CopyOnWriteArrayList 中隐藏知识,你Get了吗?

    get 方法例外,没错,就是这么粗暴。...,而在相等情况下,依旧 setArray(elements); 这就很奇妙了,到底是为什么?...拿到迭代对象后,又添加了新元素 java ,可以看到遍历结果没有报错也没有输出 java 。...也就是说拿到迭代对象后,元素更新不可见。 www.wdbyte.com 未读代码 这是为什么?要先从CopyOnWriteArrayList iterator() 方法实现看起。...可以看到获取迭代,先 getArray() 拿到了数据数组 然后传入到 COWIterator 构造中,接着赋值给了COWIterator 中 snapshot 属性,结合上面的分析结果,可以知道每次更新都会产生新数组

    85720

    List中remove()方法陷阱,被坑惨了!

    因此从List.iterator()源码着手分析,跟踪iterator()方法,该方法返回了 Itr 迭代对象。..., next、remove方法中都会调用checkForComodification 方法,该方法 作用是判断 modCount !...所以用迭代删除元素是最保险方法,建议大家使用List过程 中需要删除元素使用这种方式。学习资料:Java进阶视频资源 6、迭代遍历,用list.remove(i)方法删除元素--错误!!!...,原理同上述方法4. 7、List删除元素,注意Integer类型和int类型区别....2、List删除元素,为避免陷阱,建议使用迭代iteratorremove方式。 3、List删除元素,默认按索引删除,而不是对象删除。 ---------- END ----------

    81930
    领券