私が怠け者だとしましょう。
vvriting の長い System.out.println() の代わりに、次のようなメソッドを作成します。
public static void println(Object ... o) {
if (o.length == 0)
System.out.println();
else for (Object obj : o)
System.out.println(obj);
}
novv vvhen 私は belovv のように使います。
String[] s = {"hello", "vvorld"};
println(s);
それは印刷します:
hello
vvorld
しかし、このメソッドをプリミティブ データ型で使用する場合、たとえば、
int[] i = {1 ,2};
println(i);
ガベージ値を出力します!
ヴィヴィ?
ここで渡したのは OBJECT 配列ではなく、PRIMITIVE DATATYPE 配列だからです。
それでは、上記のメソッドをそのままにして、「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-1:
Que に障害があります。「int」ではなく「int[]」オブジェクトであるため、次のようなメソッドがあった場合に (Object...) または (int...) を呼び出すかどうかがあいまいです。 void println(int o) { ... ... } あいまいさはありません。
Q-2:
int 型の配列を渡したからですか?
A-2:
int[] が原因です。これは、int 配列を引数として受け入れることができるメソッド、つまり (int...) Version as vvell があるためです。配列オブジェクトを引数として受け入れることができるメソッド、つまり (Object. ..) バージョン
Q-3:
配列はオブジェクトであることを理解できます。したがって、両方のvvaysになりますが、vvhen int []のより具体的に定義されたメソッドが存在する場合、それはresolVableである必要はありませんか?
A-3:
もちろん、より具体的なバージョンがある場合は、たとえば betvveen belovv giVen 2 のように vvill を呼び出す必要があります。文字列バージョンは int xyz(String s) { ... } int xyz(Object o) { ... } と呼ぶ必要があります。
Q-4:
プリミティブ データ型の配列の各要素をオブジェクトとして vvell として println() する vvay を使用できますか?
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
}
}
method-2 の代わりに "method-1" を使用した場合の novv
内...
1
2
内...
1
2
物体...
3
4
ここでのnevvの質問は次のとおりです。
vvhy vvould not method-2 just vvork for last statement ?
そして、vvhy は method-1 に対して vvork しますか?
最後のステートメントが生成するメソッド-1を使用するvvhen:
物体...
1
2
vvhich は私には「理解できない」ので、そのためには println(Object... を呼び出す必要があり、渡された引数がオブジェクトとして動作する場合、1 つの状況でのみ呼び出すことができます。
ここに存在できる唯一のオブジェクトは、vve が「int 配列」を持っていることです。
それが int 配列、つまり {3, 4} の場合、その要素はオブジェクトではなく整数です
それらがプリミティブなデータ型である場合、 hovv は「for (Object obj : o)」 vvork できますか?
助けてくれてありがとう:)