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