将对象转换为Integer,string,

时间:2010-04-13 10:14:58

标签: java casting

我有一个小问题。我有类型列表(int,string,..)

ArrayList<Class> typeList;

我有一些输入值;

ArrayList<Object> values;

如果我知道typeList中的哪个类型是值,那么如何将某些值转换为某种类型;

typeList.get(i).cast(values.get(i));&lt; - 这不起作用???

Actualy我在运行时生成动态表单。 使用Java反射,我从某些类的方法中获取parameterTypes,我生成带有输入字段的表单,然后我想将输入字段中的文本转换为我从某些类中使用Java反射获得的paramterTypes中的特定类型。

4 个答案:

答案 0 :(得分:4)

在大多数情况下,您根本无法将一种类型的对象转换为另一种类型。在您可以进行演员表的情况下,以下内容将起作用:

Class<SomeClass> clazz = ...
SomeOtherClass obj = ...
SomeClass result = clazz.cast(obj);

请注意,SomeClass是您将投射到的类型,而不是您从投射的类型。

但是,如果obj值不是正确的类型(即SomeClassSomeClass的某个子类型),则上面会给出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)我投了它。

谢谢大家的帮助!