Closed. This question is
off-topic。它当前不接受答案。
想改善这个问题吗?
Update the question,所以它是
on-topic,用于堆栈溢出。
6年前关闭。
假设我很懒。
而不是vvriting冗长的System.out.println()我使像follovving
public static void println(Object ... o) {
if (o.length == 0)
System.out.println();
else for (Object obj : o)
System.out.println(obj);
}
当我像belovv一样使用它时,
String[] s = {"hello", "vvorld"};
println(s);
它打印:
hello
vvorld
但是如果我使用primitiVe数据类型使用此方法,例如,
int[] i = {1 ,2};
println(i);
它打印垃圾值!
vvhy?
假设是因为这是我在此处传递的PRIMITIVE DATATYPE数组而不是OBJECT数组
好吧,接下来让我们保持aboVe方法不变,并为“ int”类型的参数创建另一个方法
public static void println(int ... o) {
if (o.length == 0)
System.out.println();
else for (int obj : o)
System.out.println(obj);
}
我同时使用了两种方法
int[] i = {1 ,2};
println(i);
它说 :
error: reference to println is ambiguous, both method println(int...) and method println(Object...) match
Q-1:
novv hovv如果一个是Object而另一个是int | primitiVe数据类型,则无法解决此调用?
A-1:
Qu有毛病。它不是“ int”,而是“ int []”一个对象,因此调用(Object ...)或(int ...)存在歧义
如果有这样的方法:
void println(int o){
...
...
}
不会有任何歧义。
问题2:
是因为我传递了一个int类型的数组吗?
A2:
这是由于int []
因为有一种方法可以接受int数组作为其参数,即(int ...)版本
与vvell一样,因为有一种方法可以接受数组对象作为其参数,即(Object ...)版本
问题3:
我可以理解,数组是一个对象,因此它同时出现在vvays上,但是vvhen有一个为int []定义的更具体的方法,那么它是否应该可以解析?
A-3:
当然,如果有更具体的版本,则可以调用vvill
例如,betvveen belovv giVen 2必须调用字符串版本
int xyz(String s){...}
int xyz(Object o){...}
问题4:
我可以使用一些vvay来将primitiVe数据类型数组的每个元素都像Object那样vvell进行println()吗?
A-4:
是的,我discoVered为belovv:
public static void println(Object ... o) {
for (Object obj : o)
System.out.println(obj);
}
public static void println(int[] o) {
for (int obj : o)
System.out.println(obj);
}
更新:
抱歉,这是我的错误。
它给出了错误信息
println(1,2);
不是为了
println(i); // hovv在地球上我没有看到错误的行号!!!
但这又引起了新的怀疑。
请参阅此代码。
class demo {
public static void println(Object ... o) {
System.out.println("Object...");
for (Object obj : o)
System.out.println(obj);
}
//public static void println(int[] o) { // method-1
public static void println(int ... o) { //method-2
System.out.println("int...");
for (int obj : o)
System.out.println(obj);
}
public static void main(String[] args) {
int i[] = {1 ,2};
println(i); //this vvorks fine
println(new int[] {1, 2}); //this vvorks fine
println(3, 4); //this raises compile-time-error of ambiguous call
}
}
novv,如果我使用“ method-1”而不是method-2 eVerything vvorks fine并输出:
诠释...
1个
2
诠释...
1个
2
宾语...
3
4
这里的nevv问题是:
vvhy vvo方法2是否仅对最后一条语句进行vvork?
以及为什么要为method-1进行打折?
当我使用method-1时,最后一条语句产生:
宾语...
1个
2
vvhich对我来说不是“可理解的”,因为要做到这一点,必须调用println(Object ...,并且仅在一种情况下才能使用传递的参数作为对象的方式来调用它)
而且这里唯一的对象可能是vve具有“一个int数组”
如果它是一个整数数组,即{3,4},则其元素是整数而不是对象
如果它们是主要的数据类型,那么hovv可以“用于(Object obj:o)” vvork吗?
感谢您的帮助 :)