Warnung: Type safety: The expression of type Iterator needs unchecked conversion

Hi.

Bei einer Codezeile wie
Iterator<Element> iCategory = document.getRootElement().getChildren().iterator();
bekomme ich folgende Warnung

Type safety: The expression of type Iterator needs unchecked conversion to conform to
Iterator

Wenn die IDE schon so freundlich ist und mich darauf hinweist, möchte ich das irgendwie richtig machen.
Kann ich irgendwie sicher gehen, dass in der Liste definitiv nur Element-Objekte sind, sodass eventuell die Warnung sogar verschwindet?
Die einzige Möglichkeit, die mir jetzt einfallen würde, wäre, ein Methode zu schreiben, die jedes einzelne Objekt in der Liste darauf prüft, ob es ein Element ist. Davon hätte die IDE letztlich zwar nichts, aber ich wüsste für mich, dass dort definitiv das dabei rauskommt, was dabei rauskommen soll.
Gibt es ein anderes Verfahren und in wie weit würde das, was ich beschrieben habe, Sinn machen, wenn ich das in jedem Programm mache? Ich kann mir vorstellen, dass das bei äußerst komplexen XML-Dateien bei sehr vielen solcher Aufrüfe spürbar werden kann.

Mit freundlichen Grüßen
Morgyr

Die einfachste Lösung wäre es mit Annotations zu lösen, das müsste @SupressWarnings oder so ähnlich sein wenn du eclipse hast würds dir das auch anbieten.

Ich bin mir nicht sicher aber vielleicht kann man auch mit instance of Iterator testen, aber kann auch gut sein das dies garnicht geht.

Die Annotation würde so lauten:

@SuppressWarnings(„unchecked“)

Sowas nennt man legacy Code und dazu wird es demnächst ein Kapitel im Java-Blog-Buch geben :slight_smile: . Bzw. eigentlich existiert es schon seit geraumer Zeit, wir konnten es nur noch nicht veröffentlichen, da vorher ein paar andere Kapitel dran kommen müssen.

Gut, schonmal danke für die beiden antworten :slight_smile:

[QUOTE=Null]Die Annotation würde so lauten:

@SuppressWarnings(„unchecked“)[/QUOTE]
Naja, das wäre dann ja wirklich nur Warnungs-Unterdrückung.
Bei der Implementierung wird ja dabei nichts verändert.

wenn du eclipse hast würds dir das auch anbieten.

Ich habe zwar eclipse, aber anzeigen tut der mir da nichts.

Ich bin mir nicht sicher aber vielleicht kann man auch mit instance of Iterator testen, aber kann auch gut sein das dies garnicht geht.

Das habe ich grad probiert. Aus irgendeinem Grund funktioniert es aber nicht. Habe dazu mal eine Methode geschrieben, die (nach äußerst grobem Testen) funktioniert.

        public boolean checkTypesInList(Class<?> cls, List<?> list)
{
		Iterator<?> iterator = list.iterator();
		while (iterator.hasNext())
		{
			if (!iterator.next().getClass().equals(cls))
			{
			    return false;	
			}
		}
		return true;
}```
Würde ich dabei instanceof benutzen, kennt er plötzlich nicht mehr das cls. Und das benötige ich zum Testen. 
Insgesamt würde ein solcher Aufruf dann so aussehen:
if (checkTypesInList(Element.class, document.getRootElement().getChildren()))

{
@SuppressWarnings(„unchecked“)
Iterator iCategory = document.getRootElement().getChildren().iterator();
}```
(Wobei dann auch das SuppressWarnings vor die Methode oder die Klasse kommen könnte, wenn der Aufruf immer gemacht würde.)

Jetzt ist nur die Frage, wie sehen eure Erfahrungen dabei aus? Ich habe bisher noch nicht allzu viele Programme geschrieben, in denen ich mit Iteratoren gearbeitet habe.
In dem aktuellen Projekt habe ich ausversehen mal eine falsche Methode benutzt. Dadurch hatte ich in meinem Iterator plötzlich ein Element und ein Text. Dadurch bekam ich dann eine Exception, weil ich fest davon ausging, das dabei nur Elemente bei rauskommen.
Ist sowas bei größeren Projekten „alltag“ oder kommt sowas tatsächlich nur, wenn man die falschen Methoden nimmt? Bzw. ist es üblich/nötig darauf zu testen?

Mit freundlichen Grüßen
Morgyr

Also deins würde nur mit exakt der Klasse cls gehen für keine abgeleiteten Klassen.

Ja das mit instanceof geht glaube nur mit “hingeschriebenen” Klassen also keinen Variablen.

Und deine Anwendung kann dir um die Ohren fliegen weil du nur Elemente erwartest, hast du einen Kommentar oder einen Text in dem Element drin gibts Ärger. Weil dieser wird nicht in Element Objekte gepackt, daher benutz lieber den Iterator<?> oder die Methode getChildren(String) um dir die passenden Elemente zu holen.

Hm…die Sache ist, das ganze dient als Datenbank. Die Element-Namen kenne ich nicht, da sie erst durch Eingabe vom Benutzer entstehen. Eine Methode getChildren(String) wäre daher nicht angebracht.
Da die Daten dann aber noch mal nach Kategorien geschachtelt sind, suche ich innerhalb der Elemente nochmal nach neuen Children.
Das heißt, dort dürfen nur Elemente drin sein. Aber wenn ich die Methode getChildren() aufrufe, dürfte dort doch nur eine Liste von Elementen bei rauskommen. Diese gelten doch nur als Children, oder nicht? Solang nur das Programm selbst diese XML-Datei erstellt, werden wohl, solang keine Fehler entstehen, dort nur Elemente sein.
Aber dort ist es auch noch kein Problem.
Insgesamt wird so eine XML-Datei zwar groß sein, aber das Verfahren wie dort was gespeichert wird ist recht einfach. Dort wo ich die Probleme sehe, ist eher eine XML-Datei für richtig große Projekte, die zich verschiedene Daten durch verschiedene Strukturen speichern.
Bei meinem Projekt setzt sich das Leseverfahren aus lediglich 2 geschachtelten while-Schleifen zusammen. Das ist ja nichts großes. Da wird es sicherlich komplexeres geben.
Würde sich ein solches Prüfverfahren, nur um äußerste Ausnahmen zu verhindern, bei solchen Projekten lohnen, oder hat noch keiner damit Erfahrung gemacht?

Dann seh ich drei Lösungen:
Die einfachste und sicherste Lösung, nimm Iterator<?> und hol dir die Objekte raus aber bevor du sie castest teste mit instanceof ob sie passen.
Die zweite ist auch einfach aber unsicher weil man so dein Prog abschießen könnte, so wie du es gerade hast :wink:
Die dritte ist bisschen aufwändiger, der Quellcode fast so bleiben wie du sie hast, aber du machst noch eine DTD oder eine XSD mit der du deine XML beschreibst und gegen diese kannst du vorm einlesen die XML validieren lassen.

Aber was ich nicht so ganz versteh, du weißt nicht wie die XML aufgebaut ist, wie willst du sie dann verarbeiten oder wissen was da gerade drin ist? Weil wenn du bla hast dann zerfliegt dein Prog gerade weil dort Text steht.

Also solche Texte wird es in dem Programm nicht geben.
Das ganze habe ich so geregelt, dass die Werten durch den Element-Namen stehen und durch zwei Atrribute des Elements eingelesen werden.

Wenn ich mit getChildren() arbeite, bekomme ich doch nur Elemente oder nicht?

Ansonsten: Richtig, habe die XML-Shema ganz vergessen. Zu lang nichts mehr damit gemacht. Muss ich mal wieder reinlesen, danke :slight_smile:

nein du bekommst alles was in dem Element ist, alle Kommentare als Comment Objekte, alle Elemente als Element Objekt und alle Texte als Text