Wenn Sie Java Generics nicht verwenden, glaube ich, dass es nicht möglich ist, zwei Methoden in derselben Klasse zu verwenden, die sich nur in ihrem Rückgabetyp unterscheiden.
Mit anderen Worten, das wäre illegal :
%Vor%Dies gilt auch, wenn Methoden überladen werden, die einen generischen Typ zurückgeben, der verschiedene Schnittstellen implementieren kann, z. B. wenn die folgenden zwei Methoden in derselben Klassendefinition vorhanden sind:
%Vor%Wäre das illegal?
Dies ist zulässig, da der Eingabeparameter je nach Typ zu unterschiedlich ist.
Aus diesem Grund ist das Folgen zulässig,
%Vor%Aber Folgendes ist nicht,
%Vor%Danke ...
Es wird kompiliert, aber wo Sie Probleme bekommen, ist entweder Happy oder Sad eine Oberklasse der anderen.
Zum Beispiel die folgenden Kompilierungen:
%Vor%Beim Versuch, das Folgende zu kompilieren, treten jedoch Probleme auf:
%Vor% In diesem Fall können Sie einfach nicht <Integer>
zur Vorderseite hinzufügen, weil Integer immer noch eine Zahl und eine Ganzzahl ist.
Jedoch kompiliert das folgende
%Vor%also grundsätzlich so lange ein Sad-Objekt keine Instanz eines Happy-Objekts sein kann und umgekehrt, sollte Ihr Code so lange funktionieren, wie Sie ihn mit dem oder vor dem Methodennamen aufrufen.
Sie können generisch verwenden, um die Methode in Java zu unterscheiden. Die JVM sieht diesen Typ jedoch nicht, vorausgesetzt, dass das Argument oder der Rückgabetyp unterschiedlich ist und im Sun / Oracle-Compiler kompiliert wird. Dies kompiliert nicht für den IBM / Eclipse-Compiler.
Dies zeigt, dass Sie auf der Byte-Code-Ebene möchten. Ссылка
Dies ist legal, wie andere gesagt haben. Ich möchte jedoch darauf hinweisen, was passiert, wenn Typen sich gegenseitig erweitern.
Nehmen wir an, wir haben zwei Schnittstellen (funktioniert auch für Klassen und ändert nur die Signatur):
%Vor%Und zwei Funktionen:
%Vor%Wenn ein Objekt Emotion entspricht, wählt die JVM foo1. Wenn ein Objekt Happy entspricht, wählt die JVM foo2 und nicht foo1. Beachten Sie die Rangfolge. So löst die JVM die Mehrdeutigkeit. Dies ist jedoch nur gültig, wenn Sie den generischen Parameter als Argument übergeben.
Tags und Links java generics oop method-overloading