在java中将返回类型作为参数传递?

jon*_*rry 4 java

我有一些包含对象日志的文件。每个文件可以存储不同类型的对象,但单个文件是同构的——它只存储单一类型的对象。

我想编写一个方法来返回这些对象的数组,并使该数组具有指定类型(文件中的对象类型是已知的并且可以作为参数传递)。

粗略地说,我想要的是以下内容:

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]);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码不能编译(返回语句有错误,演员表有警告),但它应该让你知道我想要做什么。有关执行此操作的最佳方法的任何建议?

Nei*_*eil 5

您不能拥有通用数组,因此只需从您的方法中返回 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;
    }
Run Code Online (Sandbox Code Playgroud)

然后,当您知道实际类型时,然后进行转换。因此,假设您知道 T 在某个时候实际上是一个整数,请执行以下操作:

Integer[] array = ((ArrayList<Integer>) myList).toArray(new Integer[myList.size()]);
Run Code Online (Sandbox Code Playgroud)