Java通过反射创建泛型数组列表



我正在编程需要在c#和java上工作的对象序列化器/反序列化器类。我在c#部分处理了这个问题,如下所示:

Type listType = typeof(List<>);
                Type constructedListType;
                        type = item.Attributes["Type"].Value;
                        field = item.Attributes["Field"].Value;
                        if ((type == "Int32") || (type == "Int64") || (type == "Int16") || (type == "UInt32") || (type == "UInt64") || (type == "UInt16") || (type == "String") || (type == "Datetime") || (type == "Double") || (type == "Single"))
                        {
                            constructedListType = listType.MakeGenericType(Type.GetType(String.Format("{0}.{1}", "System", type)));
                        }
                        else
                        {
                            constructedListType = listType.MakeGenericType(Type.GetType(String.Format("{0}.{1}", WorkingNamespace, type)));
                        }
                        IList instance = (IList)Activator.CreateInstance(constructedListType);  

但我在Java中遇到了一个问题,即使用来自xml的对象类型生成泛型arraylist。

**已编辑

    type = attrMap.getNamedItem("Type").getNodeValue();
        field = attrMap.getNamedItem("Field").getNodeValue();
        type = reverseTypeConvert(type);
        Object oList;
        if ((type.equals("Integer") || type.equals("Long") || type.equals("Float") || type.equals("Short") || type.equals("String") || type.equals("Double") || type.equals("Date"))) {

            oList = Class.forName(String.format("java.util.ArrayList<%s.%s>","java.util",type)).newInstance();                  
        }
        else {
            oList = Class.forName(String.format("java.util.ArrayList<%s.%s>",this.workingPackage,type)).getGenericSuperclass();
        }
        if (!field.equals("none")) {
            Method setMethod = cObj.getClass().getMethod(String.format("%s%s", "set",field), oList.getClass());
            setMethod.invoke(cObj, oList);                  
        }
        deSerializeObject(node.getChildNodes(),oList);

所以,我在Java中找不到c代码的对应部分。谢谢你的帮助!

好的,每个人,我们处理这个问题,我理解我的错误。非常感谢。

您试图做的事情在Java中根本不起作用。事实上,这比你想做的要容易得多(在某些方面(。由于@ElliotRisch指出的类型擦除,在运行时,您可以消除泛型类型。泛型仅由编译器使用,以确保您不会向List添加对象,例如,这是您所不期望的。运行时:

List<String> strings = new ArrayList<String>();

成为

List strings = new ArrayList();

因为编译器在编译它时就知道它,所以可以确信,除非你对反射之类的事情做了疯狂的处理,否则列表中的每个对象都将是StringArrayList<String>不存在类,只有ArrayList。泛型集合仅在Objects上操作,编译器在必要时提供强制转换。

TL;DR:泛型仅在编译时提供帮助。因为您使用反射来反序列化对象,所以无论如何都不会这样(实际上,类型安全也是一种编译时构造,您可以尝试在任何对象上调用任何方法,除非实现它,否则它是不起作用的(。您的代码将负责创建将添加到通用容器中的对象,并确保所有对象都是预期的类型。

Java中的泛型只是一个编译时技巧。反射是运行时的现象。因此,当您尝试使用反射创建列表时,不需要使用泛型。只需创建一个Raw类型的列表。它将接受对象。

List oList = (List)Class.forName("java.util.ArrayList").newInstance();  

或者像这样的东西?

List oList;
        if ((type.equals("Integer") || type.equals("Long") || type.equals("Float") || type.equals("Short") || type.equals("String") || type.equals("Double") || type.equals("Date"))) {

            oList = new ArrayList<Number>();                  
        }
        else {
            oList = new ArrayList<Object>();
        }

相关内容

  • 没有找到相关文章

最新更新