Sagen Sie, ich habe diese zwei ArrayLists:
%Vor% Book
und Journal
sind zwei verschiedene Klassen.
Sowohl Book
als auch Journal
Objekte haben eine getYear()
Methode. Ich möchte eine Methode erstellen, die einen unbekannten ArrayList-Typ übergibt und ein übergebenes Jahr mit einem Objekt in der Liste vergleicht. Der folgende Code ist im Wesentlichen:
Wenn ein unbekannter Typ an die Methode übergeben wird, kann ich die Methoden dieses Objekts nicht verwenden ( getYear()
). Wie kann ich dies tun, ohne zwei Methoden zu machen, die dasselbe tun (eine für Book
und eine für Journal
)?
Sie können eine Schnittstelle (falls noch nicht vorhanden) (möglicherweise mit dem Namen HasYear
) erstellen, die die getYear()
-Methode deklariert und Book
und Journal
implementieren.
Dann kann Ihre fooBar
-Methode einen ArrayList
eines Typparameters annehmen, der ein HasYear
ist.
Das ? extends
ist aufgrund der Tatsache, dass es ein Verbraucher und kein Produzent ist.
Wie JonK sagte, wenn sie eine Oberklasse oder Schnittstelle teilen, die getYear () definiert, dann wird dies einfacher gemacht. Eigentlich muss eine dieser beiden Beziehungen haben, um Ihre vorgeschlagene Beziehung herzustellen.
%Vor%Buch.java
%Vor%Journal.java
%Vor%Nun können Sie Ihre ArrayList wie folgt erstellen und verwenden:
%Vor% Haben sowohl Book
als auch Journal
eine gemeinsame Oberklasse ( Publication
vielleicht?) oder implementieren Sie eine gemeinsame Schnittstelle, die die Methode getYear()
definiert:
Wenn Sie dann Ihre Deklarationen und Konstruktoren Book
und Journal
ändern:
Sie könnten dann eine Liste von Publication
-Objekten weitergeben:
Da es Publication
ist, das die getYear()
-Methode definiert, können Sie sie frei für Objekte verwenden, die in list
enthalten sind.
Jeder hat über den richtigen Weg diskutiert, wie man sein Objekt mit einer Superklasse assoziieren kann, die die gewünschte Methode enthält, aber wenn Sie eine ausgefallene Implementierung ohne Superklasse wollen, können Sie lambda expression ausprobieren:
%Vor%Ich weiß, das ist nicht das, was Sie wollten, aber Sie haben die richtige Lösung aus anderen Kommentaren.