我正在尝试编写一个列表(用于系统类项目),该列表将通过套接字连接序列化。
需求规范指出,List应该通过为长度写入int,然后写入每个元素来序列化。
还应该有一个(非静态)readFrom(InputStream in)方法从流中读入数据。
我想知道是否有一种方法来创建一个通用的writableelist对象,作为一个参数,并在readFrom被调用时填充自己?
据我所知,如果没有一些粗糙的反射,你就无法真正获得对象内部泛型类型的类型。所以我想把类作为参数传递给构造函数,就像这样
public class WritableList<E extends Writable> extends ArrayList<E> implements Writable {
Class<E> storedClass;
protected WritableList(Class<E> storedClass)
{
this.storedClass = storedClass;
}
@Override
public void readFrom(InputStream in) throws IOException {
int length = DataTypeIO.readInt(in);
this.clear();
for (int i = 0; i < length; i++)
{
E e;
try {
e = storedClass.newInstance();
e.readFrom(in);
add(e);
} catch (InstantiationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
然而,我不完全确定如何传入WritableList作为一个类现在。当我尝试像这样实例化它时:
grid = new WritableList<WritableList<Location>>(**What goes here?**);
我不确定传递什么样的类。我对java反射没有太大的经验,所以这里的任何帮助将是伟大的。由于
我猜应该是new WritableList<Location>(Location.class)
我认为问题出在设计上。需要首先使用.newInstance()
实例化类,然后使用它来调用.readFrom()
是没有意义的。在代码中使用.newInstance()
通常是一个不好的标志,因为它假设存在一个无参数构造函数(在本例中不存在您的WritableList
类),即使它存在,它也强制您使用无参数构造函数,防止将数据传递到对象中。