是否可以将数组列表的对象类型从对象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.
}
答案 0 :(得分:1)
从这样的文件中读取对象很少是一个好主意。就是说,您真正需要做的就是将oIS.readObject()
的结果强制转换为ArrayList<Librarian>
而不是将其携带到ArrayList<Object>
(如您现在所做的那样),然后修改{的返回类型{1}}。哦,自然也就是局部变量getLibrarianRecords
的类型。
fromFile
然后就不需要遍历列表,而是逐个元素地进行类型转换。
答案 1 :(得分:0)
感谢@ user3170251建议铸造
ArrayList<Object> librarianList = FileHandling.getLibrarianRecords(fileName);
ArrayList<Librarian> libList = new ArrayList<>();
for (Object addType: librarianList) {
libList.add((Librarian) addType);
}
要更改类型,它确实起作用。
答案 2 :(得分:0)
您可以使用此通用类定义
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();