Подтвердить что ты не робот

Тип безопасности: снятый флажок из Object to ArrayList <MyVariable>

Вот часть программы, которая отправляет ArrayList с сервера клиенту. Я хочу удалить предупреждение о последней строке в этом коде:

Клиентский код:

Socket s;
(...)
// A server is sending a list from the other side of the link.
ois = new ObjectInputStream(s.getInputStream());
MyList = (ArrayList<MyVariable>) ois.readObject();

MyVariable - это класс Java с некоторыми атрибутами. Сервер создает ArrayList и заполняет его переменными MyVariable в качестве элементов. Затем он отправляет полный список клиенту.

Я хотел бы знать, почему у меня есть предупреждение и как правильно кодировать, чтобы иметь 0 предупреждений. Если это возможно, я бы хотел избежать использования "@SuppressWarnings (" unchecked ")".;)

Спасибо,

Луис

4b9b3361

Ответ 1

Попробуйте это

Object obj = ois.readObject();
// Check it an ArrayList
if (obj instanceof ArrayList<?>) {
  // Get the List.
  ArrayList<?> al = (ArrayList<?>) obj;
  if (al.size() > 0) {
    // Iterate.
    for (int i = 0; i < al.size(); i++) {
      // Still not enough for a type.
      Object o = al.get(i);
      if (o instanceof MyVariable) {
        // Here we go!
        MyVariable v = (MyVariable) o;
        // use v.
      }
    }
  }
}

Ответ 2

Невозможно избежать этого предупреждения. readObject() возвращает объект. Вам нужно бросить его. И приведение к родовому типу всегда будет генерировать такое предупреждение.

Если вы хотите сделать свой код как можно более чистым, это хорошая идея, вы должны уважать соглашения об именах Java, хотя и начинать имена переменных с буквы в нижнем регистре.

Ответ 3

Мне это не нравится, но у вас может быть контейнер (вроде псевдонима или typedef):

// add "implements Serializable" in your case
private static class MyVariableList {
    public List<MyVariable> value;
}

И работайте с MyVariableList. Таким образом, вы явно предоставляете компилятору достаточную информацию для проверки типов во время выполнения.