Измените ArrayList с объекта на более конкретный тип - PullRequest
0 голосов
/ 22 ноября 2018

Можно ли изменить тип объекта списка массивов, т.е. с объекта ArrayList на конкретный объект ArrayList.Я пытался использовать для каждого.В качестве альтернативы есть ли способ изменить метод обработки файлов так, чтобы он мог возвращать определенный тип в зависимости от того, из какого файла он читает, без дублирования кода?

Моя попытка:

ArrayList<Object> librarianList = FileHandling.getLibrarianRecords(fileName);
ArrayList<Librarian> libList = new ArrayList<>();
for (Object addType: librarianList) {
libList.add(addType);
}

код getLibrarianRecords

public static ArrayList<Object> getLibrarianRecords(String filename){
                ArrayList<Object> fromFile = new ArrayList<>(); //Array of
                // existing librarians

                try{
                        FileInputStream fIS =
                                new FileInputStream(SYSTEM_PATH + filename);
                        ObjectInputStream oIS = new ObjectInputStream(fIS);
                        fromFile = (ArrayList<Object>)oIS.readObject();
                } catch (IOException ex){
                        System.out.println("Failed to read from file " + ex.getMessage());
                        ex.printStackTrace(); //Catches an IO exception.
                } catch (ClassNotFoundException ex){
                        System.out.println("Error class not found" + ex.getMessage());
                        ex.printStackTrace(); //Catches a class not found
                        // exception.
                }

                return fromFile; //Returns the array list.
        }

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Вы можете использовать это определение универсального класса

class ArrayListConverter<T> {
  List<T> cast;
  public ArrayListConverter(List<T> typeList){
   cast = new ArrayList<>();
   for (Object addType: typeList) {
      cast.add((T)addType);
   }

  }
  public List<T> getList(){
     return cast;
  }

}

Просто сделайте это:

ArrayListConverter<Librarian> conv = new ArrayListConverter<>(libList);
ArrayList<Librarian> libListOg  = conv.getList();
0 голосов
/ 23 ноября 2018

Редко хорошей идеей является чтение объектов из файла, подобного этому.Тем не менее, все, что вам действительно нужно сделать, это привести результат oIS.readObject() к ArrayList<Librarian> вместо переноса его к ArrayList<Object> (как вы это делаете сейчас), а затем изменить тип возвращаемого значения getLibrarianRecords.Да, и, естественно, также тип локальной переменной fromFile.

    public static ArrayList<Librarian> getLibrarianRecords(String filename){
            ArrayList<Librarian> fromFile = new ArrayList<>(); //Array of
            // existing librarians

            try{
                    FileInputStream fIS =
                            new FileInputStream(SYSTEM_PATH + filename);
                    ObjectInputStream oIS = new ObjectInputStream(fIS);
                    fromFile = (ArrayList<Librarian>)oIS.readObject();
            } catch (IOException ex){
                    System.out.println("Failed to read from file " + ex.getMessage());
                    ex.printStackTrace(); //Catches an IO exception.
            } catch (ClassNotFoundException ex){
                    System.out.println("Error class not found" + ex.getMessage());
                    ex.printStackTrace(); //Catches a class not found
                    // exception.
            }

            return fromFile; //Returns the array list.
    }

Тогда не должно быть необходимости циклически перемещаться по списку, чтобы фактически выполнить преобразование типа для элемента за элементом.

0 голосов
/ 23 ноября 2018

Спасибо @ user3170251 за предложение кастинга

ArrayList<Object> librarianList = FileHandling.getLibrarianRecords(fileName);
ArrayList<Librarian> libList = new ArrayList<>();
for (Object addType: librarianList) {
libList.add((Librarian) addType);
}

За смену типа это работает.

...