编辑: 这是我试图开始工作的方法......
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作为返回类型来使其工作?
答案 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
,您既不会捕获也不会声明抛出。我没有改变这个。