我有一些包含对象日志的文件。每个文件可以存储不同类型的对象,但单个文件是同类的 - 它只存储单个类型的对象。
我想编写一个方法来返回这些对象的数组,并使数组具有指定的类型(文件中的对象类型是已知的并且可以作为参数传递)。
粗略地说,我想要的是以下内容:
public static <T> T[] parseLog(File log, Class<T> cls) throws Exception {
ArrayList<T> objList = new ArrayList<T>();
FileInputStream fis = new FileInputStream(log);
ObjectInputStream in = new ObjectInputStream(fis);
try {
Object obj;
while (!((obj = in.readObject()) instanceof EOFObject)) {
T tobj = (T) obj;
objList.add(tobj);
}
} finally {
in.close();
}
return objList.toArray(new T[0]);
}
上面的代码没有编译(返回语句有错误,并且有关于强制转换的警告),但它应该让你知道我正在尝试做什么。有关最佳方法的建议吗?
答案 0 :(得分:4)
你不能拥有通用数组,所以只需从你的方法中返回ArrayList:
public static <T> ArrayList<T> parseLog(File log, Class<T> cls) throws Exception {
ArrayList<T> objList = new ArrayList<T>();
FileInputStream fis = new FileInputStream(log);
ObjectInputStream in = new ObjectInputStream(fis);
try {
Object obj;
while (!((obj = in.readObject()) instanceof EOFObject)) {
T tobj = (T) obj;
objList.add(tobj);
}
} finally {
in.close();
}
return objList;
}
然后,当你知道实际的类型时,然后进行强制转换。因此,假设您知道T在某个时刻实际上是一个整数,请执行以下操作:
Integer[] array = ((ArrayList<Integer>) myList).toArray(new Integer[myList.size()]);
答案 1 :(得分:1)
我看不出这是一个好的编程习惯。从本质上讲,你试图说“我想在不牺牲类型安全的情况下随意确定返回类型”。这有点尴尬。
我会说你的'最佳'选项只是返回ArrayList<T>
而不是去一个数组。