Können Sie die Methode mit Generics überladen und nur den generischen Typ der Methodensignatur ändern?

8

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?

    
Brendan Downes 29.08.2011, 03:28
quelle

5 Antworten

5

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 ...

    
Prabath Siriwardena 29.08.2011 03:35
quelle
2

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.

    
user439407 29.08.2011 04:05
quelle
2

Das lief gut.

%Vor%     
Preston 29.08.2011 03:36
quelle
1

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. Ссылка

    
Peter Lawrey 29.08.2011 05:46
quelle
1

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.

    
Andrew Johnson 09.09.2016 14:47
quelle