下面先看一下代码:
package com.eric.news;
public class TestWrapper2 {
public void doSomething(double num) {
System.out.println("deal double");
}
public void doSomething(Integer num) {
System.out.println("deal integer");
}
public static void main(String[] args) {
int i = 2;
TestWrapper2 t = new TestWrapper2();
t.doSomething(i);
}
}
哪一个method会被调用?在Tiger之前的环境中,这个很容易判断的,int会被扩展成double并调用doSomething(double num)。然而,在Tiger的环境中,看起来好像会发生boxing,所以解析后被调用的会是doSomething(Integer num),但实际上并不是这样的。
在Tiger中,因为有些的限制,所以method的解析是三个pass的过程:
1. 编译器会试着不用任何的boxing,unboxing,或者启用vararg来定位正确的method。这会找到根据Java 1.4的规则而会调用的任何method。
2. 如果第一个pass失败了,编译器会再度尝试解析method,但这次会容许boxing与unboxing转换。具有vararg的方法不在这次pass考虑范围内。
3. 如果第二个pass也失败了,编译器会做最后一次的尝试,容许boxing与unboxing,且同时也考虑到vararg method。
这样的规则可以确保维持与Tiger之前的环境的一致性。
所有结果是:
deal double
但如果修改代码为:
package com.eric.news;
public class TestWrapper2 {
public void doSomething(Double num) {
System.out.println("deal double");
}
public void doSomething(Integer num) {
System.out.println("deal integer");
}
public static void main(String[] args) {
int i = 2;
TestWrapper2 t = new TestWrapper2();
t.doSomething(i);
}
}
而这里就第一个pass就会失败,而后继续执行第二个pass,所有结果为:
deal integer
posted on 2008-04-23 15:17
周锐 阅读(316)
评论(0) 编辑 收藏 所属分类:
Java