我有一个小问题。我有类型列表(int,string,..)
ArrayList<Class> typeList;
我有一些输入值;
ArrayList<Object> values;
如果我知道typeList中的哪个类型是值,那么如何将某些值转换为某种类型;
typeList.get(i).cast(values.get(i));
&lt; - 这不起作用???
Actualy我在运行时生成动态表单。 使用Java反射,我从某些类的方法中获取parameterTypes,我生成带有输入字段的表单,然后我想将输入字段中的文本转换为我从某些类中使用Java反射获得的paramterTypes中的特定类型。
答案 0 :(得分:4)
在大多数情况下,您根本无法将一种类型的对象转换为另一种类型。在您可以进行演员表的情况下,以下内容将起作用:
Class<SomeClass> clazz = ...
SomeOtherClass obj = ...
SomeClass result = clazz.cast(obj);
请注意,SomeClass
是您将投射到的类型,而不是您从投射的类型。
但是,如果obj
值不是正确的类型(即SomeClass
或SomeClass
的某个子类型),则上面会给出ClassCastException
。< / p>
听起来你的程序应该试图转换对象,而不是简单地投射它们。或者,如果您确实需要强制转换对象,那么您的程序需要准备好处理可能的ClassCastException
。
答案 1 :(得分:0)
鉴于您在评论部分中的更新,您可以尝试以下假设已知类的列表(编译/运行时未知的代码,但仅提供指导)
for(int i = 0 ; i < valueList.size(); i++) {
Object object = valueList.get(i);
if(object instanceof String) {
//generate code for string
} else if (object instanceof Number) {
//generate code for number
}
//do like this for all class types
}
答案 2 :(得分:0)
如果你现在或将来没有很多类型的话,我会说你可以选择Calm Storm建议的if-else结构。
但是,如果您想使系统更通用和可扩展,您可以使用类似于JavaBeans机制的东西,即。每种类型都有一个“编辑器”:
interface TypeEditor {
public String generateCode(Object value);
}
然后为不同类型提供不同的具体类,如StringEditor,IntegerEditor ......
要处理编辑器,请创建类似TypeEditorManager:
的内容public class TypeEditorManager {
private static Map<Class, TypeEditor> editors = ....;
static {
editors.put(String.class, new StringEditor());
editors.put(Integer.class, new IntegerEditor());
...
}
public TypeEditor getTypeEditor(Object value) {
return editors.get(value.getClass());
}
}
请注意,如果值的类是已注册类的子类型,则getTypeEditor将返回null。我留给你作为一个功课,找出如何匹配超级班;-)(好吧,我很懒...)
您还可以通过将类型映射到编辑器(例如在单独的文件,Spring配置等中)来更容易地扩展...
然后,使用泛型使这更好。
答案 3 :(得分:0)
<强> SOLUTION:强>
所以我解决了这个问题:
if(typeList.get(t).equals(byte.class))
{
inputParams[t] = Byte.parseByte(input.getValue().toString());
}
else if(typeList.get(t).equals(short.class))
{
inputParams[t] = Short.parseShort(input.getValue().toString());
}
else if(typeList.get(t).equals(int.class))
{
inputParams[t] = Integer.parseInt(input.getValue().toString());
}
else if(typeList.get(t).equals(long.class))
{
inputParams[t] = Long.parseLong(input.getValue().toString());
}
else if(typeList.get(t).equals(float.class))
{
inputParams[t] = Float.parseFloat(input.getValue().toString());
}
else if(listOperationParameters.get(t).equals(double.class))
{
inputParams[t] = Double.parseDouble(input.getValue().toString());
}
else if(typeList.get(t).equals(boolean.class))
{
inputParams[t] = Boolean.parseBoolean(input.getValue().toString());
}
else if(typeList.get(t).equals(char.class))
{
inputParams[t] = input.getValue().toString().charAt(0);
}
else{
inputParams[t] = typeList[t].cast(input.getValue());
}
原始类型不能被强制转换,这就是我检查的原因,最后是否是它的另一个对象(也是String)我投了它。
谢谢大家的帮助!