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

时间:2011-03-12 00:04:33

标签: 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]);
}

上面的代码没有编译(返回语句有错误,并且有关于强制转换的警告),但它应该让你知道我正在尝试做什么。有关最佳方法的建议吗?

2 个答案:

答案 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>而不是去一个数组。