Übergabe des unbekannten ArrayList-Typs an die Methode

8

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:

%Vor%

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 )?

    
MortalMan 13.10.2015, 15:53
quelle

4 Antworten

13

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.

%Vor%

Das ? extends ist aufgrund der Tatsache, dass es ein Verbraucher und kein Produzent ist.

    
rgettman 13.10.2015 15:56
quelle
4

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%     
Michael 13.10.2015 16:00
quelle
3

Haben sowohl Book als auch Journal eine gemeinsame Oberklasse ( Publication vielleicht?) oder implementieren Sie eine gemeinsame Schnittstelle, die die Methode getYear() definiert:

%Vor%

Wenn Sie dann Ihre Deklarationen und Konstruktoren Book und Journal ändern:

%Vor% %Vor%

Sie könnten dann eine Liste von Publication -Objekten weitergeben:

%Vor%

Da es Publication ist, das die getYear() -Methode definiert, können Sie sie frei für Objekte verwenden, die in list enthalten sind.

    
JonK 13.10.2015 16:02
quelle
1

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.

    
krmanish007 13.10.2015 16:16
quelle

Tags und Links