标签:java arrays variadic-functions
当我使用两个不同的varargs(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
但是当我将varargs(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
解决方法:
要记住的一件重要事情是varargs被编译为创建和接受数组.那是,
void test(Integer... i)
和
void test(Integer[] i)
实际上是一回事. (挥手.有一些簿记差异.)当你打电话时:
test(i1, i2, i3);
……电话真的是
test(new Integer[] { i1, i2, i3 });
这就是问题的根源.
使用Integer …,当你使用test(null)时,你说你想要传递null作为可能是几个的第一个整数,因为Integer是一个引用类型,所以null可以匹配它.所以你要为数组中的第一个条目传递一个不精确的类型,比如这个测试(new Integer [] {null}).
使用int …,当您使用test(null)时,null不能是第一个int,因为int不是引用类型.因此编译器确定您将null作为数组本身传递.您不能尝试进行测试(new int [] {null})因为那将是无效的;所以你必须做test((int [])null).由于null对于int []参数是完全可接受的,因此调用在没有警告的情况下编译.
标签:java,arrays,variadic-functions 来源: https://codeday.me/bug/20190611/1217205.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。