【问题标题】:Casting objects to Integer,string ,将对象转换为 Integer,string ,
【发布时间】:2011-02-07 09:25:01
【问题描述】:

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

ArrayList<Class> typeList;

我有一些输入值;

ArrayList<Object> values;

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

typeList.get(i).cast(values.get(i));

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

【问题讨论】:

  • 你为什么要这样做?你到底想达到什么目的?
  • 在运行时我生成带有输入字段的动态表单。我需要将输入字段中的文本转换为字符串、整数或其他复杂类。
  • 另外说说你在做typecast之后要实现什么?你要调用一些方法(库/你自己的?)

标签: java casting


【解决方案1】:

鉴于您在 cmets 部分中的更新,您可以尝试以下假设类列表已知(代码未知编译/运行,但只是提供指导)

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
}

【讨论】:

  • 如果我有一些特定的课程怎么办?另一个类。
  • 实际上在这种情况下你根本不需要typeList,只需比较'object instanceof String'而不是'clazz instanceof String......实际上'clazz instanceof String'甚至都不起作用,如果你想这样做,你应该这样做 clazz.isAssignableFrom(String.class)。
  • 就像我说的,您需要有一个有效的特定类列表。另一方面,您可以获得实现接口并从接口生成代码的值列表
【解决方案2】:

解决方案:

所以我这样解决问题:

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());
}

原始类型不能转换,这就是我检查的原因,最后如果它是另一个对象,(也是字符串)我转换它。

感谢大家的帮助!

【讨论】:

    【解决方案3】:

    如果您现在或将来没有太多类型,我会说选择 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 配置等中......

    然后,通过使用泛型使这变得更好。

    【讨论】:

    • 哦,但这不是您想要实现的,抱歉 :-( 我仍将其留在这里,以防它可能对您产生一些价值。
    【解决方案4】:

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

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

    请注意,SomeClass 是您正在转换为的类型,而不是您正在转换的类型。

    但是,如果 obj 值不是正确的类型(即 SomeClassSomeClass 的某个子类型),则上述将为您提供 ClassCastException

    听起来您的程序应该尝试转换对象,而不是简单地转换它们。或者如果您确实需要转换对象,那么您的程序需要准备好处理可能的ClassCastExceptions。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-05
      • 2016-09-04
      • 2019-12-06
      • 2010-09-06
      • 1970-01-01
      • 2012-10-21
      相关资源
      最近更新 更多