如何在类中填充泛型容器



我正在尝试编写一个列表(用于系统类项目),该列表将通过套接字连接序列化。

需求规范指出,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类),即使它存在,它也强制您使用无参数构造函数,防止将数据传递到对象中。

相关内容

  • 没有找到相关文章

最新更新