【问题标题】:Is there a way to dinamically cast an object into a given type?有没有办法将对象动态转换为给定类型?
【发布时间】:2021-07-10 11:06:12
【问题描述】:

所以我有一个任务,我被困在其中。该程序将类的实例保存到 xml 文件中。每个字段都有一个注释,它告诉它类型的简单名称。 (Integer、String、Double 等)我在其中获取每个 xml 标记的值和属性。我创建了一个存储标签值的对象。我想将该对象转换为 xml 属性给出的类型,但由于它将是一个字符串,Java 不会让我这样做。我将复制我的部分代码以便更好地理解。

                    for(Integer j = 0; j < tulajdonsagok.getLength(); j++){
                    Node nodee = tulajdonsagok.item(j); //this is the field of the class instance in the xml
                    if(nodee.getNodeType() != Node.ELEMENT_NODE)
                    continue;
                        Element tulajdonsag = (Element)nodee;
                        String tulajdonsagNev = tulajdonsag.getNodeName(); //getting the field's name
                        Object adat = (tulajdonsag.getTextContent()); //getting the field's value
                            Attr attr = (Attr)tulajdonsag.getAttributes().getNamedItem("type");
                            //The type attribute is the value type
                            Class<?> cls = Class.forName("java.lang."+attr.getValue());
                    //}
                }

在这里,例如,如果类型是 Double,我想将名为“adat”的对象转换为给定类型。但是不知道怎么弄,因为拿到了标签的文本内容,自动变成了字符串。

【问题讨论】:

    标签: java xml object types casting


    【解决方案1】:

    在任何情况下,您都不能将String 转换为Double。相反,您需要显式处理转换。如果您知道 adat 是一个字符串,您可以提供一堆转换器,例如StringToDoubleConverterStringToIntConverter 等,根据cls 选择正确的一个并将字符串传递给该转换器。

    例子:

    interface StringConverter<T> {
      T parse(String value);
    }
    
    class StringToDoubleConverter implements StringConverter<Double> {
       Double parse(String value) {
         //parse here, I'll leave the implementation for you :)
       }
    }
    

    然后维护某种形式的存储库并提供一种获取正确转换器的方法。然后你的代码可以这样做:

    StringConverter<?> converter = converterRepo.getConverter(cls);
    Object parsedValue = converter.parse(adat);
    

    请注意,您至少在内部必须进行一些讨厌的转换,因为您不能在此处使用“可检查”类型,但如果您确保 getConverter(Double.class) 返回 StringConverter&lt;Double&gt; 您应该很好。

    很多框架都是这样做的。顺便说一句,你为什么不使用其中之一,例如杰克逊还是 JAXB?

    【讨论】:

    • 好吧,我查了一下 JAXB 是什么(不幸的是从未听说过)。这会容易得多。我之所以这样做,是因为我们的教授答应给那个人提供工作机会,他可以给他最通用的解决方案。原来,这是一个加载方法,可以在程序中的每个类中使用。我有点缺钱,我想试试,也许我能做到。无论如何,谢谢你,我会尝试你的解决方案,认为它会解决问题。非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2011-12-10
    • 2020-04-02
    • 2023-03-17
    • 2020-09-13
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多