我一直在编写一个小型Java应用程序,该应用程序使用序列化/反序列化来保存/加载ArrayLists。我编写了以下函数,该函数采用文件路径并对其中的对象进行反序列化:
private Object deserialize(String fileName)
throws IOException, ClassNotFoundException {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName))) {
return ois.readObject();
}
}
由于此函数返回对象类型,因此我将不得不将其强制转换为这样的ArrayList:
ArrayList<String> arrayList = (ArrayList<String>)deserialize("test.file");
(上面的行必须用try / catch语句包围,但是出于可读性的考虑,我在这里不包括它)
该过程对我来说很好,但是我想尝试看看是否可以将代码编辑到无需自己强制转换对象的程度,因此,我很开玩笑地键入了 作为函数的返回类型,编译器没有抱怨。然后,我将功能更改为以下功能,令我惊讶的是它确实起作用了!
private <Any> Any deserialize(String fileName)
throws IOException, ClassNotFoundException {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName))) {
return (Any)ois.readObject();
}
}
使用此函数时,我不再需要将其返回值转换为ArrayList,而可以简单地使用:
ArrayList<String> arrayList = deserialize("test.file");
我的一部分想只涉及整个过程,并在不质疑其工作原理的情况下使用该函数,但是我知道这样做会遇到麻烦。
请问有人可以解释此功能的工作原理,或者解释一下 Any 关键字,因为我以前从未见过。
答案 0 :(得分:5)
Any
不是Java中的关键字。这里要注意的关键是访问修饰符后的<Any>
。这是该方法的通用规范-该方法通过称为Any
的类型参数(然后用于在方法主体中进行转换)进行泛化,并且在调用该方法时,Java将infer the return type。 / p>
但是“ Any”一词没有什么特别的。您可能使用过“ T”或“ SomeType”甚至“ SpongeBob”来达到相同的效果。