我正在尝试编写一个List(用于系统类项目),它将通过套接字连接进行序列化。
需求规范说明应该通过为长度写一个int来序列化List,然后编写每个元素。
此外,应该有一个(非静态)readFrom(InputStream in)方法从流中读取数据。
我想知道是否有办法创建一个通用的WritableList对象作为参数,并在调用readFrom时自行填充?
据我所知,如果没有一些hacky反射,你就无法在对象内部获得泛型类型。所以我在考虑将类作为参数传递给构造函数,如此
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反射没有太多经验,所以这里的任何帮助都会很棒。感谢
答案 0 :(得分:1)
我的猜测应该是new WritableList<Location>(Location.class)
答案 1 :(得分:0)
我认为问题在于设计。需要首先使用.newInstance()
实例化该类,然后使用它来调用.readFrom()
是没有意义的。 .newInstance()
在代码中使用时通常是一个坏符号,因为它假定存在无参数构造函数(在本例中对于WritableList
类不存在),即使它存在,它会强制您使用无参数构造函数,以防止数据传递到对象中。