我正在编程需要在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();
因为编译器在编译它时就知道它,所以可以确信,除非你对反射之类的事情做了疯狂的处理,否则列表中的每个对象都将是String
。ArrayList<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>();
}