在Android Java代码中使用泛型

Using generics in Android Java code

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

1
2
3
4
5
FileInputStream fis = new FileInputStream(filename);
    ObjectInputStream in = new ObjectInputStream(fis);
    MyClass newObject = (MyClass)in.readObject();
    in.close();
    return newObject;

我希望此方法是泛型的,因此我可以告诉它我希望in.readObject()将其输出强制转换为什么类型,并返回它。

希望这是有意义的……然后,我可能没有正确理解泛型,这实际上是不可能的,或者是不明智的。

谢谢,d.


我不确定Android(或者它可能有什么限制),但是在爪哇你可以做这样的事情:

1
2
3
4
5
6
7
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;
}

然后像这样称呼它

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

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


刚刚看到这一点,我如何使方法返回类型成为泛型?我将尝试以下方法:

1
2
3
4
5
6
7
8
9
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);
    }