有人可以向我解释一下吗
List<Integer> list = new LinkedList<Integer>();
list.add(2);
list.add(1);
list.add(3);
当我使用
list.remove(1);
然后第一个元素被删除
list.remove(new Integer("1"));
然后第二个元素被删除。
那么,您能解释一下上述场景中自动装箱和拆箱的行为吗
when new A().a(new Integer("1"));
执行于,
public class A {
public void test(Integer i) {} //1
public void test(int i) {} //2
public void test(Object o) {}//3
}
方法1执行
public class A {
public void test(int i) {} //2
public void test(Object o) {}//3
}
方法3已执行
基本上重载决议会更喜欢Object
参数超过int
出现时的参数Integer
争论。 (它会更喜欢带有一个重载int
参数超过Object
or Integer
当出现int
当然是争论。)
From JLS 第 15.12.2 节 http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12.2(讨论被删减):
确定适用性的过程从确定潜在适用的方法开始(第 15.12.2.1 节)。该过程的其余部分分为三个阶段。
讨论
划分阶段的目的是确保与旧版本的 Java 编程语言的兼容性。
第一阶段(第 15.12.2.2 节)执行重载解析,不允许装箱或拆箱转换,或使用变量 arity 方法调用。如果在此阶段没有找到适用的方法,则处理继续到第二阶段。
第二阶段(第 15.12.2.3 节)执行重载解析,同时允许装箱和拆箱,但仍然阻止使用变量 arity 方法调用。如果在此阶段没有找到适用的方法,则处理继续到第三阶段。
第三阶段(§15.12.2.4)允许重载与可变数量方法、装箱和拆箱相结合。
As Integer
可以隐式转换为Object
,重载解析在第一阶段成功,因此永远不会考虑拆箱转换。
如果这不能让您满意地解释所有内容,请评论哪一点仍然让您感到困惑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)