posts - 431,  comments - 344,  trackbacks - 0
下面先看一下代码:

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 周锐 阅读(313) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: