У меня есть следующий интерфейс:
public interface Result<T extends Serializable> extends Serializable{
T getResult();
}
С этим интерфейсом я не могу определить переменную типа
Result<List<Integer>>
потому что List не является сериализуемым.
Однако, если я изменил интерфейс на это:
public interface Result<T> extends Serializable{
T getResult();
}
Теперь становится невозможным реализовать с проверкой времени компиляции, потому что нет гарантии, что T сериализуется, а вся точка класса - сохранить результат, чтобы я мог вернуть его позже, возможно, после передачи через Интернет.
Мой вопрос в том, есть ли способ объявить переменную так, чтобы она была двух типов, или есть какой-то другой способ сделать это, чего я не вижу? Итак, возможно, что-то вроде:
(List<Integer> extends Serializable) value = new ArrayList();
Я пытаюсь поставить столько бремени этой проблемы на реализацию, чтобы будущие потребители этого интерфейса не знали о проблеме.
Спасибо за вашу помощь!
Вот более подробный пример того, что я пытаюсь сделать: Я вызываю сервер, результат которого я хочу сохранить в объекте результата, но я не хочу иметь дело с кастингом. Таким образом, каждый метод, который может быть вызван на сервере, будет определять тип результата с помощью дженериков. Этот объект результата также сохранит другие метаданные о результате, например, может быть, слишком много информации для возврата. Во многих случаях я хочу использовать список, но интерфейс List не сериализуем, хотя многие из реализаций.
Итак, как я могу указать, что используемый тип должен быть Serializable, но все же допускать использование List (а не конкретной реализации List)?