【问题标题】:How to pass datatype and use it in method with java?java - 如何传递数据类型并在java方法中使用它?
【发布时间】:2015-02-21 21:47:53
【问题描述】:

编辑: 这是我正在尝试的方法...

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() 我无法让它工作。 以下不起作用,我得到“类型不匹配:无法从 Class 转换为 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 作为返回类型来让它工作呢?

【问题讨论】:

  • 问:你到底想要什么?如果你想“写一些通用的东西”——那么使用 Java 1.5++“Generics”。如果你想“重新发明”泛型——那就不要。考虑使用 Java 或与 Java 兼容的脚本语言(如 Groovy)可以做什么
  • Trinimom:谢谢,这对我有点帮助。但是在使用返回时我无法让它工作。 FoggyDay:不,我不想重新发明任何东西。我想要的问题是不是吗?
  • 您能否展示更多您的新代码 - 目前尚不清楚您所做的更改。

标签: java types return arguments


【解决方案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 为 Integer,并且会尝试将其强制转换为 Integer,但从文件中加载了实际的 String。

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

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

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

【讨论】:

  • 我想这是比我尝试的更好的方法,所以我将使用这种方法运行。谢谢!我还从代码中删除了 try-catch 以显示相关内容。
猜你喜欢
  • 1970-01-01
  • 2011-01-15
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多