I already have a solution, but I don’t like it. Also, it would be nice to know your thoughts about this.
You see, elem.get gives back an Object, that is going to be a Float in the case of x and y.
This code throws the Exception described in the title:
String names[] = { "x", "y", "src" };
Class types[] = { float.class, float.class, String.class };
for (int i = 0; i < names.length; i++)
{
if (elem.containsKey(names[i]))
{
par.add(types[i]);
arg.add(types[i].cast(elem.get(names[i])));
}
}
The code is used to define the list of parameters to instantiate an object. Both the parameters and the object’s class name are defined in an external data file (but nevermind about that).
The solution, something I’m not fond of (because it loses the flexibility I was trying to attain), has this within the for:
if(types[i] == float.class)
{
float v = (Float)elem.get(names[i]);
arg.add(v);
} else
{
arg.add(types[i].cast(elem.get(names[i])));
break;
}
Other option would be changing float.class to Float.class in types, but I won’t do that because that code is used to instantiate objects which have float parameters in their constructors.
Thanks!
As the type of
argsis anArrayList<Object>, you’re not avoiding the boxing anyway:If the point is to call a constructor by reflection, then you’re going to have to pass in a
Floatfor anyfloatparameters – that’s just how it works.So basically, change
float.classtoFloat.classand it should all work fine. EDIT: Ah, except then theparlist will have the wrong type. Basically you want to cast withFloat.class, but addfloat.classto the list of parameter types.You probably want a map from primitive types to wrapper types, like this:
Then:
In fact, if you trust that the values are of the right type already, I suspect you can just do:
After all, you’re just casting to a particular type and then losing that type information again… using the
castcall does perform a check that the execution-time types are correct though, so you may want to keep it for that reason.