gpt4 book ai didi

java - 重载可变参数数组,选择方法

转载 作者:搜寻专家 更新时间:2023-10-30 21:31:46 25 4
gpt4 key购买 nike

我有两个重载方法:foobar

//Object[]... vs Integer[]...
public static String foo(Object[]... args) { return "Object[] args"; }
public static String foo(Integer[]... args) { return "Integer[] args";}

//Object... vs Integer[]...
public static String bar(Object... args) {return "Object args";}
public static String bar(Integer[]... args) {return "Integer[] args";}

现在当我像这样使用它们时:

Integer[] i = { 5 };
System.out.println(foo(i));//Object[]... vs Integer[]...
System.out.println(bar(i));//Object... vs Integer[]...

我得到了

Integer[] args
Object args

问题来了:为什么我们有两个不同的输出?
Integer[] 可以隐式转换为 ObjectObject[]

最佳答案

这基本上是编译器决定调用所有方法中最具体的方法。

当你打电话时

System.out.println(foo(i));//Object[]... vs Integer[]...

它将调用 foo(Integer[]... args)

因为在运行时,JVM 将调用委托(delegate)给带有 Integer[][] 参数的方法,而不是 带有 Object[][] 参数的方法 由 varags 指定。因为使用 Integer[][] 而不是 Object[][] 调用方法会更具体。


在后面的语句中,当你调用

System.out.println(bar(i));//对象... vs Integer[]...

它将转到 bar(Object... args)

同样通过使用可变参数,参数的类型将是 Object[] 而不是 Object[][]。编译器将再次调用最具体的方法,该方法将是具有 Object... args 的方法。

如果您通过按照以下方式删除 varags 来更改方法签名:

   //Object... vs Integer[]...
public static String bar(Object args) {

return "Object args";
}

public static String bar(Integer[] args) {
return "Integer[] args";
}

然后您会注意到它会调用 bar(Integer[] args),因为它更特定于方法调用。

所以根据 JLS Subtyping among Array Types 更精确,

  • 如果 S 和 T 都是引用类型,则 S[] > T[] iff S > T。
  • 对象 > 对象[]

这意味着将对具有 Integer[][] 而不是 Object[][] 的方法调用 Integer[]。其中 Integer[] 的调用将针对 Object[] 而不是 Integer[][]。

参见 here用于选择最具体的方法。

关于java - 重载可变参数数组,选择方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33467077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com