Die Methode ist zweideutig, für die Typ Fehler
Ich versuche zu verstehen, wie das Überladen in JAVA arbeitet, und versuchen, zu begreifen, von verschiedenen überlastung Regeln, die angewendet werden, im Fall von Erweiterung, autoboxing und varargs in JAVA. Ich bin nicht in der Lage zu verstehen, was passiert ist in das folgende Szenario:
package package1;
public class JustAClass {
public static void add(int a, long b) {
System.out.println("all primitives");
}
//public static void add(Integer a, long b) {
// System.out.println("Wraper int, primitive long");
//}
public static void add(int a, Long b) {
System.out.println("Primitive int, Wrapper long");
}
public static void add(Integer a, Long b){
System.out.println("All wrapper");
}
public static void main(String[] args) {
int a = 10;
Integer b = 10;
long c = 9;
Long d = 9l;
add(a,c);
add(a,d);
add(b,c);
add(b,d);
}
}
An dieser Stelle, bekomme ich einen Kompilierungsfehler bei der Dritten Anrufung der add
Methode sagen The method is ambiguous for the type Error
.
Warum ist das so? Was sind die Regeln zur Bestimmung der Aufruf der Methode arbeiten? Was ist da genau passiert im folgenden Fall?
Ich fühle, dass fourth
überladene add-Methode funktionieren sollte. Bitte helfen Sie mir zu verstehen, das Konzept hinter dieser.
- Die Regeln sind in der Sprache Java-Spezifikationen, und Sie sind extrem langwierig und Komplex. Erinnern Sie grundsätzlich unmöglich ist, und dies ist, warum Sie sollten nie, nie schreiben Sie code wie den oben genannten, weil Sie fast sicher sein kann, einzuführen bugs. Ich respektiere Ihren Wunsch zu verstehen, aber um das zu tun, sollten Sie Lesen Sie die JLS: docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12
- Ich denke, die Frage ist völlig legitim. Sie können lernen, die Spezifikation von Sie zu zerbrechen und zu verstehen, warum es bricht, dann wird es nie wieder tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt 3 Stufen, um die Methode überladen Auflösung. Die erste Stufe nicht auto-boxing/unboxing, was bedeutet, dass Methoden, die erfordern, dass boxing/unboxing der übergebenen Parameter, um eine der überladenen Versionen von
add
werden nur berücksichtigt, wenn keine übereinstimmung gefunden wurde, die nicht erforderlich ist, boxing/unboxing. Das ist, warum Sie 3 Anrufe, die über eine einzelne genaue übereinstimmung, Arbeit. Bezüglichadd(b,c);
, siehe unten, wieso es mehrdeutig.