我一直在编写一个小型java应用程序,它使用序列化/反序列化来保存/加载ArrayList。我编写了以下函数,它采用文件路径并反序列化其中的对象:
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 语句包围,但为了可读性,我没有将其包含在此处)
这个过程对我来说效果很好,但是我想尝试看看是否可以将代码编辑到不需要自己强制转换对象的程度,所以我开玩笑地输入了 Any 作为我函数的返回类型,编译器没有提示。然后我将函数更改为以下内容,令我惊讶的是它确实有效!
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关键字,因为老实说我以前从未见过它。
最佳答案
Any
不是 Java 中的关键字。这里需要注意的关键是 <Any>
在访问修饰符之后。这是该方法的通用规范 - 该方法使用名为 Any
的类型参数进行泛化。 (然后您可以使用它在方法主体中进行转换),当您调用该方法时,Java 将 infer the return type .
但是“Any”这个词并没有什么特别之处。您可以使用“T”或“SomeType”甚至“SpongeBob”来达到相同的效果。
关于java - 有人可以解释一下这个函数(我不小心写了 ("Any"关键字)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56974610/