在Android Java代码中使用泛型

cod*_*dog 4 java generics serialization android

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

FileInputStream fis = new FileInputStream(filename);
    ObjectInputStream in = new ObjectInputStream(fis);
    MyClass newObject = (MyClass)in.readObject();
    in.close();
    return newObject;
Run Code Online (Sandbox Code Playgroud)

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

希望这是有道理的...然后再说一遍,我可能没有正确理解泛型,这实际上是不可能的,或者是可取的.

感谢:D.

And*_*anu 7

我不确定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;
}
Run Code Online (Sandbox Code Playgroud)

然后把它称为

MyClass myObj = getObject("in.txt");
Run Code Online (Sandbox Code Playgroud)

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

  • (T)演员阵容不安全并且有充分理由发出警告.如果您正在读取的类型本身是泛型类型,则使用此方法可能会导致类型压缩.例如`List <String> foo = getObject('file')`将把它读入的任何列表放入`foo`,即使它包含的不是字符串.只有在你开始使用他的列表时才会注意到这个错误. (3认同)