如何传递数据类型并在java方法中使用它?

时间:2015-02-21 21:47:54

标签: java types return arguments

编辑: 这是我试图开始工作的方法......

public static <T> void save(T t, Object o, String fileName)
{
        ObjectOutputStream out = 
                new ObjectOutputStream(
                        new FileOutputStream(fileName));
        out.writeObject((T)o);
        out.close();
}

public static <T> T load(T t, String fileName)
{
    T object = null;

    ObjectInputStream in = 
            new ObjectInputStream(
                    new FileInputStream(fileName));
    object = (T)in.readObject();
    in.close();

    return (T)object;
}

使用以下代码时保存有效。

int test = 7;
save(int.class, test, "test.dat");

但是使用load()我无法使用它。 以下不起作用,我得到“类型不匹配:无法从类转换为int”。

int test2 = load(int.class, "test.dat");

如果我将其更改为Eclipse建议:

Class<Integer> test = method(int.class);

我得到一个异常:“java.lang.Integer不能转换为java.lang.Class”。

那么我应该如何使用T作为返回类型来使其工作?

1 个答案:

答案 0 :(得分:1)

尽管我对整体设计有普遍关注,但在实际代码工作方面,真正的问题是你不需要将int.class传递给T变量 - 你需要传递你要写的对象。

因此,如果您将其更改为:

,您的代码将会正常工作
public static <T> void save(T t, String fileName)
{
        ObjectOutputStream out = 
                new ObjectOutputStream(
                        new FileOutputStream(fileName));
        out.writeObject(t);
        out.close();
}

public static <T> T load(String fileName)
{
    T object = null;

    ObjectInputStream in = 
            new ObjectInputStream(
                    new FileInputStream(fileName));
    object = (T)in.readObject();
    in.close();

    return (T)object;
}

并将其称为:

    save(50, "C:\\test.dat");
    save("A String", "C:\\test2.dat");

    Integer t1 = load("C:\\test.dat");
    System.out.println(t1);

    String t2 = load("C:\\test2.dat");
    System.out.println(t2);

话虽如此,这种方法存在许多问题。正如您已经知道的那样,在这种情况下,T变量的使用几乎为零,并且您从中获得的收益并不多。

如果类型错误,则转换仍将在运行时失败。例如此代码仍会引发ClassCastException,,因为编译器知道您希望T为整数,并尝试将其强制转换为整数,但从文件中加载实际的String。

    save("A String", "C:\\test2.dat");
    Integer t1 = load("C:\\test2.dat");

我不确定它实际上有多么有用 - 但是在使代码实际运行方面,这应该没问题。

此外,您提供的代码无法编译,因为文件处理中的异常会引发IOException,您既不会捕获也不会声明抛出。我没有改变这个。