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

How to pass datatype and use it in method with java?

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

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() 我无法让它工作。 以下不起作用,我得到 "Type mismatch: Cannot convert from Class to int".

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

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

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

我得到一个异常:"java.lang.Integer cannot be cast to java.lang.Class"。

那么我应该如何将 T 用作 return 类型才能使其正常工作?

尽管我对整体设计有普遍的担忧,但就让您的实际代码正常工作而言,真正的问题是您不需要将 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 为整数,并会尝试将其转换为整数,但实际的字符串会从文件中加载。

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

我不确定它实际上有多大用处 - 但就让您的代码实际工作而言,这应该没问题。

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