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)"
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
Sie brauchen das, weil Sie kein Iterable<ArrayList>
haben wollen, was es in Ihrer aktuellen Implementierung ist.
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
.
Ausgabe
%Vor% 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:
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:
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.
Wenn T
% Iterable
erweitert, tun Sie das einfach:
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%