如何传递数据类型并在 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
,您既没有捕获也没有声明将其抛出。我没有改变这个。
编辑: 这是我尝试开始工作的方法...
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
,您既没有捕获也没有声明将其抛出。我没有改变这个。