假设我很懒。
而不是 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);
}
novv vv 当我像 belovv 一样使用它时,
String[] s = {"hello", "vvorld"};
println(s);
它打印:
hello
vvorld
但是当我使用这个方法时 vvith primitiVe 数据类型,例如,
int[] i = {1 ,2};
println(i);
它打印垃圾值!
为什么?
假设是因为它是 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);
}
novv 拥有我使用的两种方法
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 当一个是对象而另一个是 int|a primitiVe 数据类型时,这个调用不能被解析吗?
A-1:
阙有错。它不是“int”它是“int []”一个对象,因此如果调用 (Object...) 或 (int...) 如果有类似的方法存在歧义: void println(int o) { ... ... } 不能有任何歧义。
Q-2:
是因为我传递了一个 int 类型的数组吗?
A2:
这是由于 int[] 因为有一种方法可以接受 int 数组作为其参数,即 (int...) 版本为 vvell,因为有一种方法可以接受数组对象作为其参数,即 (Object. ..) 版本
Q-3:
我可以理解数组是一个对象,因此它既可以使用 vvays,但是如果有更具体定义的 int[] 方法,那么它不应该是可解析的吗?
A-3:
当然,如果有一个更具体的版本,那么 vvill 将被称为例如 betvveen belovv giVen 2 字符串版本必须被称为 int xyz(String s) { ... } int xyz(Object o) { ... }
Q-4:
我可以有一些 vvay 来 println() primitiVe-datatypes 数组的每个元素作为 vvell 和 Objects 吗?
A-4:
是的,我发现它是 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我没有看到错误的行号!!!
但它再次引起了 nevv 的怀疑....
请看这段代码..
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 并输出:
诠释...
1
2
诠释...
1
2
目的...
3
4
这里的 nevv 问题是:
vvhy vvould not method-2 只是 vvork 用于最后一条语句?
并且 vvhy 它适用于方法 1 ?
vv当我使用方法1时,最后一条语句产生:
目的...
1
2
vvhich 对我来说不是“可以理解的”,因为要发生这种情况, println(Object... 必须被调用,并且如果传递的参数表现为对象,则只能在一种情况下调用它
并且这里唯一的对象是 vve 有“一个 int 数组”
如果那是一个 int 数组,即 {3, 4} 它的元素是整数而不是对象
如果它们是 premitiVe 数据类型,hovv 可以“for (Object obj : o)” vvork 吗?
感谢您的帮助 :)