相同的方法调用,LinkedList、Queue与List的不同结果

我已经阅读了LinkedList, queue vs list 中的线程差异,但仍然不理解以下代码行为:

List<Integer> l = new LinkedList<>();
l.add(10);
l.add(12);
l.remove(1); // removes index 1
System.out.println(l); // outputs [10]
    
Queue<Integer> q2 = new LinkedList<>();
q2.add(10);
q2.add(12);
q2.remove(1); // tries to remove object 1
System.out.println(q2); // outputs [10, 12]

我知道,为什么输出不同:

  • l调用的情况下remove(1)删除具有索引的元素1
  • 如果q调用remove(1)试图删除一个对象1,但只有整数1012.

如果我仔细看看接口:

  • Queue没有remove(int)方法,而是remove(Object)从Collection继承了一个方法。
  • List有一个remove(int index)andremove(Object o)方法。

到现在为止还挺好。

但是:我不明白,Java 如何能够在使用相同语法 ( remove(1)) 的同时调用两种不同的方法?

回答

对于List,编译器remove(int)根据方法签名选择:

确定适用性的过程始于确定潜在适用的方法(第 15.12.2.1 节)。然后,为确保与 Java SE 5.0 之前的 Java 编程语言兼容,该过程将分三个阶段继续进行:

  1. 第一阶段执行重载决议,不允许装箱或拆箱转换,或使用可变参数方法调用。如果在此阶段未找到适用的方法,则处理继续到第二阶段。

注意强调的部分,这意味着编译器匹配1int。既然有一个适用的方法remove(int),那就是选择调用的方法。换句话说,首先考虑原始类型,然后再考虑引用类型,例如Integer(用于 的装箱类型int)。


以上是相同的方法调用,LinkedList、Queue与List的不同结果的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>