Может ли кто-нибудь объяснить эту функцию, которую я случайно написал (ключевое слово «Any»)? - PullRequest
2 голосов
/ 10 июля 2019

Я писал небольшое 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 , как я, честно говоря, никогда не видел его раньше.

1 Ответ

5 голосов
/ 10 июля 2019

Any не является ключевым словом в Java. Ключевым моментом, на который следует обратить внимание, является <Any> после модификатора доступа. Это общая спецификация метода - метод обобщается с параметром типа с именем Any (который затем используется для приведения в теле метода), и когда вы вызываете метод, Java выведет тип возврата .

Но в слове "Любой" нет ничего особенного. Вы могли бы использовать «T» или «SomeType» или даже «SpongeBob» для того же эффекта.

...