Ist eine dynamische Überladungsauflösung in Java möglich?

8

Also habe ich eine Klasse von überladenen Methoden wie folgt:

%Vor%

Ich muss je nach Typ einen Eigenschaftswert einer Bean an eine dieser Methoden übergeben, aber ich kenne den tatsächlichen Eigenschaftstyp erst zur Laufzeit. z.B.

%Vor%

BTW, PropertyUtils.getProperty() ist eine Hilfsmethode, die einen Wert der angegebenen Eigenschaft für eine Bean zurückgibt. PropertyUtils.getProperty() gibt ein Objekt zurück, so dass test(Object value) immer aufgerufen wird und der tatsächliche Eigenschaftstyp ignoriert wird.

Ich kann den Property-Typ in der Laufzeit ermitteln, selbst wenn der Wert null ist. Gibt es so etwas wie dynamisches Casting in Java? Wenn nicht, gibt es eine Möglichkeit, eine überladene Methode mit dem richtigen Parametertyp aufzurufen?

    
Tom Tucker 24.12.2010, 02:36
quelle

4 Antworten

5

Das Überschreiben hat in Java eine dynamische Bindung. Überladen hat eine statische Bindung, und welche Funktion aufgerufen wird, wird zur Kompilierzeit bestimmt, nicht zur Laufzeit. Siehe diese SO-Frage.

Daher können Sie das Überladen für die Laufzeitauswahl von Methoden nicht verwenden. Schlagen Sie vor, dass Sie eines der anderen OOP-Entwurfsmuster in Java verwenden oder zumindest instanceof :

%Vor%     
Jason S 24.12.2010, 02:43
quelle
3

Dies ist ein Job für das Besuchermuster.

    
EJP 24.12.2010 09:11
quelle
1

Überladene Methodenauflösung findet zur Kompilierzeit in Java statt. Sie müssen die Auflösung selbst durchführen (ein Switch, wenn-dann-else-Kontaktplan oder Tabellensuche) oder ein anderes Muster finden, das in Java implementiert werden kann.

    
Jim Garrison 24.12.2010 02:44
quelle
1

Ich bin mir nicht sicher, ob Sie eine Antwort auf diese Frage wünschen. Sie möchten eine Situation einrichten, in der

%Vor%

macht nicht dasselbe wie

%Vor%

Für x , die String s sind. Dies ist eine schlechte Idee ™ und wird nur zu viel Verwirrung führen. Verwenden Sie einen anderen Methodennamen, wenn Sie ein anderes Verhalten wünschen.

Machen Sie test(Object x) dispatch zu test(String x) , wenn x ein String ist, dann müssen Sie sich keine Gedanken darüber machen, welche test -Methode aufgerufen wird.

    
Keith Randall 24.12.2010 04:05
quelle

Tags und Links