【问题标题】:Using generics in Android Java code在 Android Java 代码中使用泛型
【发布时间】:2011-04-18 04:09:23
【问题描述】:

我是 Java 新手,所以我不确定这是否可行。基本上我需要将文件反序列化为给定类型的对象。基本上该方法会这样做:

FileInputStream fis = new FileInputStream(filename);
    ObjectInputStream in = new ObjectInputStream(fis);
    MyClass newObject = (MyClass)in.readObject();
    in.close();
    return newObject;

我希望这个方法是通用的,因此我可以告诉它我想要in.readObject() 将其输出转换为什么类型,然后返回它。

希望这是有道理的......再说一次,我可能没有正确理解泛型,这实际上是不可能的,也不可取。

谢谢, D.

【问题讨论】:

  • 我还没有真正尝试过 - 不知道从哪里开始/

标签: java android generics serialization


【解决方案1】:

刚刚看到How do I make the method return type generic?,我将尝试以下方法:

public <T> T deserialiseObject(String filename, Class<T> type)
            throws StreamCorruptedException, IOException,
            ClassNotFoundException {
        FileInputStream fis = new FileInputStream(filename);
        ObjectInputStream in = new ObjectInputStream(fis);
        Object newObject = in.readObject();
        in.close();
        return type.cast(newObject);
    }

【讨论】:

    【解决方案2】:

    我不确定 Android(或它可能存在的任何限制),但在 Java 中您可以执行以下操作:

    public static <T> T getObject(String filename) throws IOException, ClassNotFoundException {
        FileInputStream fis = new FileInputStream(filename);
        ObjectInputStream in = new ObjectInputStream(fis);
        T newObject = (T) in.readObject();
        in.close();
        return newObject;
    }
    

    然后像这样称呼它

    MyClass myObj = getObject("in.txt");
    

    这会给你一个未经检查的强制转换警告,因为编译器不能确定你可以将接收到的对象强制转换为提供的类型,所以它不完全是类型安全的。您需要确保从输入流中获得的内容实际上可以转换为该类,否则您将获得 ClassCastException。您可以通过使用 @SuppressWarnings("unchecked") 注释方法来抑制警告

    【讨论】:

    • 太棒了!那更整洁,而且有效! :o) 非常感谢!
    • 太棒了,MyClass 需要什么接口或构造函数才能工作
    • 嗯,它基本上只是一个演员表。因此,仍然需要输入流所需的任何内容,使用 Object 而不是 T。但没有增加对接口或构造函数的新要求。
    • (T) 演员表是不安全的,并且有充分的理由生成警告。如果您正在阅读的类型本身是泛型类型,则使用此方法可能会导致类型污染。例如List&lt;String&gt; foo = getObject('file') 会将它读到的任何列表放入foo,即使它包含的不是字符串。这个错误只有在你开始使用他列表时才会注意到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2012-01-15
    • 1970-01-01
    相关资源
    最近更新 更多