#java #generics
#java #дженерики
Вопрос:
Я читаю объекты из сериализованного файла, и мне действительно не нравится тот факт, что я должен привести результат, например
vars = (HashMap<String, Integer>) out.readObject();
Будучи поклонником информации о типах, я ненавижу приведение. Можно ли избежать этого и явно указать, какой тип следует считывать из сериализованного файла?
Комментарии:
1. Я думаю, что другого метода нет.
2. Нет. Разберитесь с этим.
Ответ №1:
ObjectInputStream
не является универсальным типом и не предоставляет универсальных методов.
Для предоставленных существуют специальные методы read[primitive]
, но для реальных объектов readObject
предоставляется только is — который возвращает Object
.
Конечно, если вам не нужно использовать собственные Serializable
Externalizable
интерфейсы Java или и вы предпочитаете сериализовать с помощью определенных фреймворков (например, Jackson), вы можете воспользоваться методами, которые не требуют явного понижения при де-сериализации.
Примечание
ObjectInputStream
нет final
, и вы можете расширить его, чтобы предоставить свою собственную реализацию, которая могла бы позволить вам предоставить универсальный класс или метод и предотвратить приведение при вызове какого readTypedObject
-либо собственного метода.
Затем вы могли бы сравнить readClassDescriptor()
с инициализированной Class<T>
вами собственной ObjectInputStream
реализацией, чтобы убедиться, что считываемый объект может быть назначен вашему параметризованному типу.
Однако T
в какой-то момент вы все равно закончите приведение к, поскольку вы, вероятно, тоже не хотите переопределять readObject
!
TL; DR, на мой взгляд, слишком много усилий и сложностей, я бы просто пошел с приведением на стороне получателя.
Комментарии:
1. К сожалению, OIS на самом деле имеет общие методы, такие как
private final Object readObject(Class<?> type)
, но они являются частными для реализации.