OOP ClassCastException bei casting von eigener Klasse aus Iterator

Skrodde

Aktives Mitglied
Hallo zusammen,
in meinem Projekt gibt es folgende Methode:

Java:
//Convert the result into a solution
			HashMap<Variable,Number> variableAssignment = new HashMap<Variable,Number>();
			
			for(Iterator<Object> iter = prob.getVariables().iterator(); iter.hasNext();) {
				Variable variable = (Variable) iter.next();
				variableAssignment.put(variable, result.get(variable.getName()));
			}

Diese nutzt

Java:
public ArrayList<Variable> getVariables();

auf der Klasse Variable

Java:
public class Variable {
	
	private String identifier;
	private OptVarType type;
	private Number lowerBound;
	private Number upperBound;
}

Wenn ich das Programm mit einem Testfall starte, bekomme ich momentan den folgenden Fehler in der fünften Zeile des ersten Listings:

Code:
Objective: 6266 {y=52, x=22}
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to Variable
	at ILPSolver.solve(ILPSolver.java:108)
	at Opt.mysolverTest(Opt.java:107)
	at Opt.main(Opt.java:25)

Ich verstehe nun überhaupt nicht, warum der Iterator mir als Objekt einen String ausspuckt, es sollte doch eine Variable sein, oder?

Vielen Dank für's durchsehen, Gruß, Skrodde
 
wenn du schon Generics hast, verwende doch Iterator<Variable>, dann kannst du dir den Cast sparen,
oder verzichte ganz auf Iterator und schreibe
Java:
for (Variable variable : prob.getVariables()) {
   variableAssignment.put(variable, result.get(variable.getName()));
}

mit deinem Problem hatte das freilich bisher nichts zu tun,
in der Liste ist einfach ein String drin, daran ist nicht zu rütteln

aus deinem Code ist nicht erkennbar, wer das macht, da die Liste generisch ist dürfte es nicht ganz so leicht sein,
möglich ist es aber, Generic ist kein Universalschutz, letztlich ist eine ArrayList für alle Objekte da

schlimmstenfalls ist das gesamte Programm verdächtig,
unter 4 Mio. guten Code-Zeilen kann eine böse sein und einen String einfügen,

poste nur vollständige Programme, für vollständige Antworten 😉
oder schaue selber an wo die Liste verwendet wird
 
[EDIT]Zu langsam 😀[/EDIT]

Warum nicht mit einer for-each?

Java:
for(Variable v : prob.getVariables()) {
    variableAssignment.put(v, result.get(v.getName()));
}
 
Vielen Dank für die Anregung, ich habe mich dann noch mal mit meinem Code auseinander gesetzt und festgestellt, dass ich nicht
Java:
public ArrayList<Variable> getVariables();
aus meiner OptProblem-Klasse nutze, sondern
Java:
Collection<Object> getVariables()
aus der Problem-Klasse von JavaILP. Und dort werden Variablen nur als Strings repräsentiert ... 😳

In so fern ist alles gut und ich bedanke mich bei euch für den Denkanstoß, damit kann ich jetzt weiter machen :applaus:

P.S. Natürlich dann mit for-each Schleife 🙂
 

Neue Themen


Zurück
Oben