如何使用其他数据类型的参数重载方法?

时间:2013-09-29 08:22:20

标签: java overloading

我有一个简短的程序来测试java中的重载方法。 这是我的代码:

public static void main(String[] args) {
    // TODO code application logic here
    // Case 1
    f2(5);
    // Case 2
    char x = 'a';
    f2(x);
    // Case 3
    byte y = 0;
    f2(y);
    // Case 4
    float z = 0;
    f2(z);
}

还有我的方法:

public static void prt(String s) {
    System.err.println(s);
}

public static void f2(short x) {
    prt("f3(short)");
}

public static void f2(int x) {
    prt("f3(int)");
}

public static void f2(long x) {
    prt("f5(long)");
}

public static void f2(float x) {
    prt("f5(float)");
}

这就是结果:

f3(int)
f3(int)
f3(short)
f5(float)

我无法理解如何运行案例2和3.对我有什么解释?

1 个答案:

答案 0 :(得分:2)

在重载方法的情况下,方法调用将根据类型参数和您传递的实际类型调用最具体的方法。

方法调用转换遵循以下路径:

  • 身份转换:首先搜索完全匹配的方法。如果找到,将调用它。从类型转换为相同类型。
  • 扩展原始转换:如果没有完全匹配的方法,则根据从实际参数到格式类型参数的扩展转换选择方法。

还有更多,但不适用于此。请参阅JLS 5.3 for Method Invocation Conversion

因此,对于f2(x);因为char类型没有完全匹配,所以调用方法f2(int),因为char可以是最具体的类型通过加宽转化率转换为int不,charshort不是扩大转化。

类似地,对于f2(y)byte类型没有完全匹配,因此调用方法f2(short),因为shortbyte最具体的类型byte 1}}可以扩展为。

请参阅JLS 5.1.2 for Widening Primitive conversions

  

对原始类型的19个特定转换称为扩展   原始转换:

     
      
  • shortintlongfloatdoubleshort
  •   
  • intlongfloatdoublechar
  •   
  • intlongfloatdouble或{{1}}
  •   
相关问题