17 Stimmen

Gibt es einen Grund dafür, dass Java late/static binding für überladene Methoden in derselben Klasse verwendet?

Gibt es einen bestimmten Grund, warum Java eine frühe Bindung für überladene Methoden verwendet? Wäre es nicht möglich, dafür late binding zu verwenden?

Exemple :

public class SomeClass {

    public void doSomething(Integer i) {
        System.out.println("INTEGER");
    }

    public void doSomething(Object o) {
        System.out.println("OBJECT");
    }

    public static void main (String[] args) {
        Object i = new Integer(2);
        Object o = new Object(); 
        SomeClass sc = new SomeClass();
        sc.doSomething(i);
        sc.doSomething(o); 
    } 
}

Drucke: OBJEKT OBJEKT

Ich würde eher erwarten: INTEGER OBJEKT

2voto

Stan Kurilin Punkte 15324

Das ist möglich. Und noch mehr, es gibt solchen Code in der Standardbibliothek (Klasse - TreeSet, Autor (sic!) Josh Bloch ).

In einem seiner Vorträge sagt er, dass dies ein Fehler war.

Von Joshua Bloch Wie man eine gute API entwirft und warum sie wichtig ist

Überlastung mit Vorsicht

  • Vermeiden Sie zweideutige Überschneidungen
    • Mehrere Überlastungen, die für dieselben Istwerte gelten
    • Konservativ: keine zwei mit gleicher Anzahl von Argumenten
  • Nur weil Sie es können, heißt das nicht, dass Sie es auch tun sollten.
    • Oft ist es besser, einen anderen Namen zu verwenden
  • Wenn Sie eine Ambulanz zur Verfügung stellen müssen gleiche Argumente

    public TreeSet(Collection c); // Ignoriert die Reihenfolge

    public TreeSet(SortedSet s); // Beachtet die Reihenfolge

1voto

Bozho Punkte 570413
void doSomething(Comparable c) {..}
void doSomething(Iterable i) {..}

class Foo implements Comparable, Iterable { ..}

doSomething(new Foo()); // which one??

1voto

Matt Ball Punkte 343109

Sie sehen OBJECT OBJECT statt INTEGER OBJECT denn Sie haben declarado i zu sein Object , nicht ein Integer . Wenn Sie dies stattdessen tun:

public class SomeClass {

    public void doSomething(Integer i) {
        System.out.println("INTEGER");
    }

    public void doSomething(Object o) {
        System.out.println("OBJECT");
    }

    public static void main (String[] args) {
        Integer i = new Integer(2);
        Object o = new Object(); 
        SomeClass sc = new SomeClass();
        sc.doSomething(i);
        sc.doSomething(o); 
    } 
}

Sie erhalten INTEGER OBJECT .

http://ideone.com/sEZrP


Als Antwort von Thorbjørn erklärt, liegt dies daran, dass der Methodenaufruf zur Kompilierzeit und nicht zur Laufzeit disambiguiert wird.

1voto

Iain Galloway Punkte 17770

Andere haben das "Warum" besser erklärt, als ich es könnte.

Ich möchte jedoch darauf hinweisen, dass Sie, wenn Sie dieses Verhalten wünschen, einen Blick auf folgende Seiten werfen sollten Doppelversand und insbesondere die Besucher-Muster .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X