Я писал небольшое Java-приложение, которое использует сериализацию / десериализацию для сохранения / загрузки списков массивов. Я написал следующую функцию, которая берет путь к файлу и десериализует объекты в нем:
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 , как я, честно говоря, никогда не видел его раньше.