【问题标题】:Java : Overloading [duplicate]Java:重载[重复]
【发布时间】:2017-08-17 18:50:02
【问题描述】:

使用 Wrapper 类重载方法

void Test1(Object o)
{
    System.out.println("object");
}


void Test1(Integer o) 
{
System.out.println("Integer"); 
}

void Test1(Long o)
{
    System.out.println("Long");
}

调用Test1(1)会调用Integer,但是当我们在用Integer作为文本注释方法后调用Test1(1)时,它会调用Object文本的方法,而不是Long的方法。

再次

void Test1(Object o)
{
    System.out.println("object");
}


void Test1(Integer o) 
{
System.out.println("Integer"); 
}

void Test1(Long o)
{
    System.out.println("Long");
}
void Test1(int o)
{
    System.out.println("int");
}

还要考虑我们调用 Test1('a') 的情况,所以它会调用 int one。现在删除 int 一,因此它应该调用 Integer 一,因为“a”将更改为 int,而 int 将更改为 Integer,但在这种情况下,它将调用 Object 一。 有什么具体原因吗?

【问题讨论】:

  • 为什么它不调用 Long,如果我们评论 Integer one

标签: java overloading


【解决方案1】:

JLS 5.1.7 中指定的自动装箱转换非常具体。 int 只会转换为 Integer

所以你有两个重载:一个需要 Long,一个需要 Object。请注意,Long not 扩展了 Integer。所以如果你传入一个 Integer 类型的参数,Long 方法就不能接受它。唯一可以的重载是接受 Object 的重载。

您的困惑可能源于以下两种想法之一:

  • 要么转换将尝试1 -> 1L -> Long.valueOf(1L)
  • 或者 Long 扩展了 Integer,因此采用 Long 的方法可以接受 Integer 的参数

在 Java 中这些都不成立。

【讨论】:

  • 说我们还有一个 int 方法,现在我们正在调用 Test1('a').... 所以 int 方法被调用。但是如果我们删除 int 方法,那么应该调用 Integer 。但在那种情况下,对象方法会被调用......为什么会这样?
  • 'a' 是一个字符,所以同样,它只会被装箱到Character。但是 char 原语 可以自动扩展为 int 原语(即使 Character 不能自动转换为 Integer),所以如果你传入一个 char,并且有一个接受 int 的重载,那么这个重载是有效的。
【解决方案2】:

当您调用 Test1(1) 时,1 是一个 int 而不是 long。传递 1L 将作为 long 传递并调用正确的方法。

【讨论】:

    【解决方案3】:

    Integer 类是 Number 类的子类,Object 类的子类。

    Long 也是 Number 类的子类。但是 Integer 和 Long 类之间没有直接的层次关系(除了都是 Number 的子级)。

    如果您使用 Integer 注释该方法,那么根据 java 继承,它将看到它的父引用(实际上直接父引用将是 Number,但没有一个方法在其签名中包含 Number 类)对象类和方法签名匹配它将被调用。因此,您将输出作为“对象”。

    检查 JLS 链接(来自 @yshavit 的另一个答案)也可以了解有关它为何如此行为的更多详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 2013-10-18
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      相关资源
      最近更新 更多