Generische Listendruckmethode

8

Ich versuche, eine generische Druckmethode zu schreiben, die für alle Klassen funktioniert, die die "Iterable" -Schnittstelle implementieren.

%Vor%

aber ich erhalte den Fehler "Die Methode print (T []) in der Art Liste ist nicht anwendbar für die Argumente (ArrayList)"

    
manis 06.01.2014, 19:14
quelle

4 Antworten

7

Ihr Parameter ist T[] . Welches ist ein Array eines Typs, der Iterable erweitert. Sie wollen einfach T . Sie benötigen aber auch eine Typvariable für den Typparameter in Iterable . Du brauchst

%Vor%

Sie brauchen das, weil Sie kein Iterable<ArrayList> haben wollen, was es in Ihrer aktuellen Implementierung ist.

    
Sotirios Delimanolis 06.01.2014 19:16
quelle
4

Ihre generische Definition ist nicht korrekt. Sie versuchen, die Grenzen für <T extends Iterable<T>> festzulegen, aber der generische Parameter ( Integer ) ist nicht T .

Sie können es durch die Einführung eines separaten generischen Parameters zum Laufen bringen: eins, um die Sammlung anzuzeigen, und eins, um die Werte der Sammlung anzugeben.

Hinweis: Sie benötigen T[] überhaupt nicht. Sie wollen nur T .

%Vor%

Ausgabe

%Vor%     
Jeroen Vannevel 06.01.2014 19:21
quelle
2

Da System.out.println alle Object s akzeptiert und Sie Ihre Generika nicht wirklich innerhalb der Methode verwenden, sehe ich keinen Grund, Generika überhaupt zu verwenden. Dieser Code wird das gleiche erreichen:

%Vor%

Was Sie getan haben

Ich möchte auch hinzufügen, dass Sie die T[] ziemlich verwirren. T[] bedeutet " ein Array vom Typ T ". Aber du versuchst, es an ein ArrayList zu übergeben, was nicht dasselbe ist wie ein Array (Die Klasse ArrayList verwendet intern interne Arrays, aber das ist irrelevant) .

Sehen wir uns Ihre ursprüngliche Methodendeklaration an:

%Vor%

Diese Methode akzeptiert einen Parameter, der wie folgt lautet: Ein Array eines generischen Typs T, bei dem der generische Typ T über den generischen Typ T iterierbar ist.

Lassen Sie uns diesen letzten Teil noch einmal lesen: wobei der generische Typ T über den generischen Typ T iterierbar ist.

Das heißt, der generische Typ sollte über sich selbst iterierbar sein.

Sie benötigen eine Klasse wie diese, um Ihre aktuelle print -Methode zu verwenden:

%Vor%

Und dann verwende deine Druckmethode wie folgt:

%Vor%

Mit Ihrer aktuellen Druckmethode würde sie jedoch nur die Methode MyClass.toString für jedes der 5 Elemente im Array aufrufen.

    
Simon Forsberg 16.08.2014 10:47
quelle
0

Wenn T % Iterable erweitert, tun Sie das einfach:

%Vor%

Bearbeiten: Was Sie deklariert haben, war T extends Iterable<T> , was zum Beispiel iterable sein könnte, was wahrscheinlich nicht das ist, was Sie erreichen wollen. Dann fügen Sie einfach einen anderen Typ der Elemente der Liste hinzu.

Wenn Sie nicht spezifisch mit dem Typ arbeiten, können Sie den generischen Typ auch wie folgt deklarieren:

%Vor%     
Kuba Spatny 06.01.2014 19:16
quelle

Tags und Links