2010-04-13 50 views
0

我有一个小问题。我有类型列表(int,string,..)将对象投射为整数,字符串,

ArrayList<Class> typeList; 

我有一些输入值;

ArrayList<Object> values; 

如何一些值转换到某种类型的,如果我知道哪些类型从类型串是值;

typeList.get(i).cast(values.get(i)); < - 这是行不通的???

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

+2

你为什么想这样做?你究竟在努力实现什么? – 2010-04-13 10:16:27

+0

在运行时我用输入字段生成动态表单。我需要将输入字段中的文本转换为字符串,整型或另一个复杂类。 – Milan 2010-04-13 10:18:54

+2

也谈谈在做类型转换之后你会做什么?你打算调用一些方法(图书馆/你自己的?) – 2010-04-13 10:19:09

回答

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 
} 
+0

以及如果我有一些特定的课程?另一班。 – Milan 2010-04-13 10:23:37

+0

实际上,在这种情况下你根本不需要typeList,只是比较'object instanceof String'而不是'clazz instanceof String ...'而实际上'clazz instanceof String'甚至不能工作,你应该做clazz.isAssignableFrom String.class)如果你想这样做。 – fish 2010-04-13 10:35:17

+0

就像我说过的,你需要有一个有效的特定类别列表。另一方面,你可以得到一个实现接口的值列表,并从接口 – 2010-04-14 12:57:01

4

在大多数情况下,你只需不能将一种类型的对象转换为另一种类型。在情况下,你可以做演员,下面的工作:

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

注意SomeClass是你铸造类型,而不是类型,你是铸造从

但是,如果obj的值不是正确的类型(即SomeClassSomeClass的某个子类型),那么上面将给出ClassCastException

它听起来像你的程序应该试图转换的对象,而不是简单地施放它们。或者,如果您确实需要投射这些物体,那么您的程序需要做好准备,以处理可能的ClassCastException s。

0

如果你现在或将来没有很多类型,我会说去看看由冷静风暴建议的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。我把它留给你作为一个家庭作业,以找出如何匹配超类;-)(好吧,我很懒......)

你也可以通过将类型映射到编辑器例如在一个单独的文件,弹簧配置等...

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

+0

中生成代码哦,但这不是你想要实现的,对不起:-(我仍然会在这里留下它,以防它可能产生对你有一些价值。 – fish 2010-04-13 10:57:28

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

基本类型无法施展,这就是为什么我检查,并在年底如果有些另一个对象,(也字符串)我投它。

谢谢大家的帮助!