gpt4 book ai didi

java - 使用 var-args 的重载方法 - 结合装箱和扩大

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

当重载包含不匹配参数的方法时,JVM 将始终使用具有比参数宽的最小参数的方法。

我已经通过以下两个例子证实了上述内容:

加宽:byte加宽为int

class ScjpTest{

static void go(int x){System.out.println("In Int");}
static void go(long x){System.out.println("In long");}

public static void main (String[] args){

byte b = 5;

go(b);

}

装箱:将 int 装箱到 Integer

class ScjpTest{

static void go(Integer x){System.out.println("In Int");}
static void go(Long x){System.out.println("In Long");}

public static void main (String[] args){

int b = 5;

go(b);

}

}

以上两个例子都输出正确的“In Int”。当情况涉及 var-args 时,我很困惑,如下例所示

class ScjpTest{

static void go(int... x){System.out.println("In Int");}
static void go(long... x){System.out.println("In lInt");}

public static void main (String[] args){

byte b = 5; //or even with: int b = 5

go(b);

}

}

以上会产生以下错误:

ScjpTest.java:14: reference to go is ambiguous, both method go(int...) in ScjpTest and method go(long...) in ScjpTest match
go(b);
^
1 error

为什么它不应用与前面示例中相同的规则?即将字节加宽为 int,因为它是大于字节的最小值?

最佳答案

var-args 语法只是将数组作为参数传递的别名:

foo(int ... arg) 等于 foo(int[] arg)

但是数组不是分层的。 String[] 不是 Object[] 的子类。完全相同的规则与方法参数相关。因此,当您传递 byte 时,编译器无法区分接受 long[]int[] 的 2 个重载方法。

关于java - 使用 var-args 的重载方法 - 结合装箱和扩大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7056907/

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