Как заполнить общий контейнер внутри класса? - PullRequest
0 голосов
/ 05 ноября 2011

Я пытаюсь написать список (для проекта системного класса), который будет сериализован через сокетное соединение.

В спецификациях требований сказано, что список должен быть сериализован, написав int для длины, а затем записав каждый элемент.

Кроме того, должен быть (нестатический) метод readFrom (InputStream in), который считывает данные из потока.

Мне было интересно, есть ли способ создать универсальный объект WritableList, который принимает в качестве параметра и заполняет себя, когда вызывается 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-рефлексии, поэтому любая помощь здесь будет отличной. Спасибо

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Я думаю, это должно быть new WritableList<Location>(Location.class)

0 голосов
/ 05 ноября 2011

Я думаю, что проблема с дизайном этого. Нет смысла сначала создавать экземпляр класса, используя .newInstance(), а затем использовать его для вызова .readFrom(). .newInstance() обычно является плохим признаком при использовании в коде, поскольку предполагает наличие конструктора без аргументов (который в данном случае не существует для вашего WritableList класса), и даже если он существует, он заставляет вас используйте конструктор без аргументов, предотвращающий передачу данных в объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...