Warum es (scheinbar) einen Unterschied, ob ich null
als Argument direkt übergeben oder ein Object
passieren, dass ich den Wertnull
zugewiesen?Java-Methode Dispatch mit Null-Argumente
Object testVal = null;
test.foo(testVal); // dispatched to foo(Object)
// test.foo(null); // compilation problem -> "The method foo(String) is ambiguous"
public void foo(String arg) { // More-specific
System.out.println("foo(String)");
}
public void foo(Object arg) { // Generic
System.out.println("foo(Object)");
}
Mit anderen Worten, warum der (kommentiert-out) zweiter Anruf foo(...)
nicht zu foo(Object)
versandt?
Update: Ich benutze Java 1.6. Ich könnte Hemals Code ohne Probleme kompilieren, aber meiner kompiliert immer noch nicht. Der einzige Unterschied, den ich sehe, ist, dass Hemals Methoden statisch sind, während meine nicht. Aber ich verstehe wirklich nicht, warum das einen Unterschied machen sollte ...?
Update 2: Gelöst. Ich hatte eine andere Methode foo (Runnable) in meiner Klasse, so dass der Dispatcher nicht eindeutig die spezifischste Methode auswählen konnte. (Siehe meinen Kommentar in Hemals zweiter Antwort.) Danke für Ihre Hilfe.
Gerade getestet, und ich bin betäubt, dass (a) 6u11 nicht sagt, es ist mehrdeutig, und (b), dass Null in String nicht Object aufgelöst wird. Lerne jeden Tag etwas Neues - +1 für den Unterricht. –
@Software Monkey: Sobald Sie akzeptieren, dass die Konstante Null vom Typ Null ist und der Null-Typ ist ein Subtyp aller Typen, ist dies ziemlich offensichtlich. Objekt
Pedanterie: Die Methode überschreibt das Objekt mit String. Überladen bedeutet, dass der Methodenname derselbe ist, aber die Signatur variiert weiter. Ausgezeichnete Antwort. Danke. – Sam