Können Sie die Methode überladen mit Generika und ändern Sie nur den generischen Typ der Signatur der Methode?
Wenn Sie nicht die Verwendung von Java Generics, ich glaube, es ist nicht möglich, dass zwei Methoden in der gleichen Klasse, die unterscheiden sich nur in Ihren Rückgabetyp.
In anderen Worten, dies wäre illegale:
public HappyEmotion foo(T emotion) {
//do something
}
public SadEmotion foo(T emotion) {
//do something else
}
Ist dasselbe gilt, wenn dem überladen von Methoden, die einen generischen Typ, kann die Implementierung der verschiedenen Schnittstellen, wie zum Beispiel, wenn Sie die folgenden beiden Methoden in der gleichen Klasse definition:
public <T extends Happy> T foo(T emotion) {
//do something
}
public <T extends Sad> T foo(T emotion) {
//do something else
}
Wäre das illegal?
- Haben Sie versucht, um es zu kompilieren? Eine (konforme) compiler werden Ihnen umgehend sagen, was legal ist und was illegal ist. Eine bessere Frage wäre "warum ist ... illegal? "" wenn Sie nicht verstehen, die Gründe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist legal, da die input-parameter auch unterscheidet sich basierend auf dem Typ..
Aus diesem Grund, ist nach rechtlichen,
Aber nicht,
Dank...
Diese lief einwandfrei.
Es kompiliert wird, aber wo man in Probleme, wenn entweder Glücklich oder Traurig ist eine Superklasse der anderen ist.
Beispielsweise die folgenden zusammenstellt:
Jedoch, Sie laufen in Probleme, wenn Sie versuchen, kompilieren Sie das folgende:
In diesem Fall, Sie können nicht einfach hinzufügen
<Integer>
an die front, weil Integer ist noch sowohl eine Zahl als auch eine ganze Zahl.Jedoch die folgenden kompiliert
also im Grunde so lange, wie eine Traurige Objekt nicht eine Instanz von einem Happy-Objekt und Umgekehrt, dein code sollte funktionieren, solange Sie es nennen mit dem oder vor den Namen der Methode.
Können Sie generisch zu unterscheiden, die Methode in Java. Die JVM nicht sehen, diese Art jedoch das argument-oder Rückgabetyp ist anders, es wird immer noch kompilieren in der Sun/Oracle-compiler. Dies kann nicht kompiliert werden, für die IBM/eclipse-compiler.
Dieser zeigt Ihnen wollen, ist das geschehen bei der byte-code-Ebene. http://vanillajava.blogspot.com/2011/02/with-generics-return-type-is-part-of.html
Dies ist legal, wie andere gesagt haben. Allerdings möchte ich darauf hinweisen, was passiert, wenn Typen erweitern sich gegenseitig.
Sagen wir, wir haben zwei Schnittstellen (funktioniert für Klassen ändern Sie einfach die Signatur):
Und zwei Funktionen:
Wenn ein Objekt entspricht Emotion der JVM wählen foo1.
Wenn ein Objekt entspricht, Freut sich die JVM wählen foo2 und nicht foo1.
Beachten Sie die Reihenfolge der Priorität. Das ist, wie die JVM löst die Mehrdeutigkeit. Dies ist jedoch nur gültig, wenn Sie an die generischen parameter als argument.