Java 将对象强制转换为整数、字符串、,

Java 将对象强制转换为整数、字符串、,,java,casting,Java,Casting,我有一个小问题。我有类型列表(int,string,…) ArrayList类型列表; 我有一些输入值 ArrayList<Object> values; ArrayList值; 如果我知道类型列表中的哪种类型是值,如何将某个值转换为某个类型 typeList.get(i).cast(values.get(i))如果您在注释部分进行了更新,您可以尝试以下方法,假设类列表已知(代码不知道如何编译/运行,但只是提供了一个指导) for(int i=0;i

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

ArrayList类型列表;
我有一些输入值

ArrayList<Object> values;
ArrayList值;
如果我知道类型列表中的哪种类型是值,如何将某个值转换为某个类型


typeList.get(i).cast(values.get(i))如果您在注释部分进行了更新,您可以尝试以下方法,假设类列表已知(代码不知道如何编译/运行,但只是提供了一个指导)

for(int i=0;i
如果您在“注释”部分进行了更新,您可以在已知类列表的情况下尝试以下操作(编译/运行的代码未知,但仅供参考)

for(int i=0;i
在大多数情况下,您无法将一种类型的对象强制转换为另一种类型。在您可以执行强制转换的情况下,以下操作将起作用:

Class<SomeClass> clazz = ...
SomeOtherClass obj = ...
SomeClass result = clazz.cast(obj);
Class clazz=。。。
SomeOtherClass obj=。。。
SomeClass结果=clazz.cast(obj);
请注意,
SomeClass
是您要转换到的类型,而不是从中转换的类型

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


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

在大多数情况下,您无法将一种类型的对象强制转换为另一种类型。在您可以执行强制转换的情况下,以下操作将起作用:

Class<SomeClass> clazz = ...
SomeOtherClass obj = ...
SomeClass result = clazz.cast(obj);
Class clazz=。。。
SomeOtherClass obj=。。。
SomeClass结果=clazz.cast(obj);
请注意,
SomeClass
是您要转换到的类型,而不是从中转换的类型

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


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

如果您现在或将来没有太多类型,我会说选择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());
    }
}
公共类TypeEditorManager{
私有静态地图编辑器=。。。。;
静止的{
put(String.class,new StringEditor());
put(Integer.class,newintegereditor());
...
}
公共类型编辑器getTypeEditor(对象值){
返回editors.get(value.getClass());
}
}
请注意,如果值的类是已注册类的子类型,则getTypeEditor将返回null。我把它作为一个家庭作业留给你们,让你们知道如何匹配超类;-)(好吧,我很懒……)

您还可以通过将类型映射到编辑器(例如,在单独的文件、Spring配置等中)使其更易于扩展


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

如果您现在或将来没有太多的类型,我会说使用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());
    }
}
公共类TypeEditorManager{
私有静态地图编辑器=。。。。;
静止的{
put(String.class,new StringEditor());
put(Integer.class,newintegereditor());
...
}
公共类型编辑器getTypeEditor(对象值){
返回editors.get(value.getClass());
}
}
请注意,如果值的类是已注册类的子类型,则getTypeEditor将返回null。我把它作为一个家庭作业留给你们,让你们知道如何匹配超类;-)(好吧,我很懒……)

您还可以通过将类型映射到编辑器(例如,在单独的文件、Spring配置等中)使其更易于扩展


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

解决方案:

所以我这样解决问题:

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());
}
基元类型不能强制转换,这就是我检查的原因,最后,如果它是另一个对象,(也是字符串),我强制转换它


谢谢大家的帮助

解决方案:

所以我这样解决问题:

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());
}
基元类型不能强制转换,这就是我检查的原因,最后,如果它是另一个对象,(也是字符串),我强制转换它


谢谢大家的帮助

你为什么要这么做?您实际想要实现什么?在运行时,我使用输入字段生成动态表单。我需要将文本从输入字段转换为字符串、int或其他形式