Java : Overloading

标签 java overloading

使用包装类重载方法

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 1,因此它应该调用 Integer 1,因为“a”将更改为 int,而 int 将更改为 Integer,但在这种情况下,它将调用 Object 1。 有什么具体原因吗?

最佳答案

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

因此,您有两个重载:一个需要 Long,另一个需要 Object。请注意,Long扩展 Integer。因此,如果您传入 Integer 类型的参数,Long 方法将无法接受它。唯一可以的重载是采用 Object 的重载。

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

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

这些在 Java 中都不是真的。

关于Java : Overloading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45742919/

相关文章:

Java RSA 加密不可重复?

java - 将二进制值写入文件以进行霍夫曼编码

java - 未使用 docx4j 库在 docx 中创建表

c++ - 检测类是否具有重载函数在 Comeau 编译器上失败

c++ - 为什么 auto 不能用于重载函数?

c++ - 链表c++,重载[],整体结构

java - 构建错误 : missing artifact com. sun :tools:jar:1. 6

java - 为什么在 Spring Boot 上使用 MappingJacksonValue

c# - Visual Studio Intellisense 不显示泛型重载的方法

java - 我可以使用枚举元素而不是字符串将 JSoup Elements 类重载为 getElementsByTag 吗?