Number类可以用作参数来接受所有类型的数字作为参数吗?

时间:2015-02-07 08:34:27

标签: java types numbers

我希望这个方法能够接受整数,然后加倍。 可以将Number类用作参数,以便可以接受所有数字作为参数。 (我怀疑它可以适用,但仅适用于整数,而不是整数。)

1 个答案:

答案 0 :(得分:4)

是的,自动装箱可以将int转换为Number以及从int转换为Integer

public class Test {
    public static void main(String[] args) throws Exception {
        foo(10);
        foo(10.5);
        foo(10.5f);
        foo(java.math.BigInteger.ONE);
    }

    static void foo(Number number) {
        System.out.println(number + " " + number.getClass());
    }    
}

或者更确切地说,装箱本身只会从int转换为Integer,但扩展参考转换会从Integer转换为Number。来自JLS 5.3

  

调用上下文允许将方法或构造函数调用(第8.8.7.1节,第15.9节,第15.12节)中的参数值分配给相应的形式参数。

     

严格的调用上下文允许使用以下之一:

     
      
  • 身份转换(第5.1.1节)
  •   
  • 扩大原始转换(第5.1.2节)
  •   
  • 扩大参考转换(第5.1.5节)
  •   
     

松散的调用上下文允许更宽松的转换集,因为如果使用严格的调用上下文找不到适用的声明,它们仅用于特定的调用。松散的调用上下文允许使用以下之一:

     
      
  • 身份转换(第5.1.1节)
  •   
  • 扩大原始转换(第5.1.2节)
  •   
  • 扩大参考转换(第5.1.5节)
  •   
  • 拳击转换(§5.1.7),可选地后跟加宽参考转换
  •   
  • 一个拆箱转换(第5.1.8节),可选地后跟一个加宽的基元转换
  •   

在这种情况下,使用松散的调用上下文(对于foo的前三次调用),因为使用严格的调用上下文不能找到方法声明。