gpt4 book ai didi

java - 使用 (int...i) 和 (Integer...i) 的 varagrs 有什么区别

转载 作者:搜寻专家 更新时间:2023-11-01 01:49:36 24 4
gpt4 key购买 nike

当我使用两个不同的可变参数 (Integer...i) 和 (int...i) 运行此代码时,带有 (Integer...i) 的代码输出显示警告消息,而另一个运行正确。但是我无法理解它们之间的区别。

public static void test(Integer...i) {

System.out.println("int array");
}

public static void main(String[] args) {
test(null);
}

当运行这段代码时,警告信息会像那样显示。

File.java:11: warning: non-varargs call of varargs method with inexact argument type for last parameter;
test(null);
^cast to Integer for a varargs call

但是当我将可变参数 (Integer...i) 更改为 (int...i) 时,代码运行完美。

public static void test(int...i) {

System.out.println("int array");
}

public static void main(String[] args) {
test(null);
}

输出显示为:

int array

最佳答案

要记住的一件关键事情是可变参数被编译为创建和接受数组。也就是说,

void test(Integer... i)

void test(Integer[] i)

实际上是同一件事。 (挥手。记账有一些差异。)当你调用它时:

test(i1, i2, i3);

...电话真的是

test(new Integer[] { i1, i2, i3 });

这就是问题的根源。

对于 Integer...,当您使用 test(null) 时,您是说您希望将 null 作为第一个传递可能是几个整数,因为 Integer 是一个引用类型,所以 null 可以匹配它。因此,您为数组中的第一个条目传递了一个不精确的类型,例如 test(new Integer[] { null })

对于 int...,当您使用 test(null) 时,null 不能是第一个 int 因为 int 不是引用类型。因此,编译器确定您将 null 作为 array 本身传递。你不能尝试做 test(new int[] { null }) 因为那是无效的;所以你必须做 test((int[])null)。由于 null 对于 int[] 参数是完全可接受的,因此调用编译时不会发出警告。

关于java - 使用 (int...i) 和 (Integer...i) 的 varagrs 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45057236/

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