如何在类中填充泛型容器?

时间:2011-11-04 22:32:35

标签: java generics reflection

我正在尝试编写一个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反射没有太多经验,所以这里的任何帮助都会很棒。感谢

2 个答案:

答案 0 :(得分:1)

我的猜测应该是new WritableList<Location>(Location.class)

答案 1 :(得分:0)

我认为问题在于设计。需要首先使用.newInstance()实例化该类,然后使用它来调用.readFrom()是没有意义的。 .newInstance()在代码中使用时通常是一个坏符号,因为它假定存在无参数构造函数(在本例中对于WritableList类不存在),即使它存在,它会强制您使用无参数构造函数,以防止数据传递到对象中。