В моем случае это сработало только для объявления конкретного типа:
HashMap<String, String> mySerializableMap = new HashMap<>();
Это позволило мне использовать методы Map
(например, put
) и передать карту методам, которые требовали Serializable
, без приведения. Не идеально, когда мы научились программировать на интерфейсы, но достаточно хорошо для меня в ситуации, в которой я находился.
Если вы действительно настаиваете: как уже было отмечено, объявление только комбинированного интерфейса не решает проблему, так как конкретные классы, которые у нас уже есть, не реализуют наш комбинированный интерфейс, даже когда они реализуют каждый из двух интерфейсов, которые мы объединяем. Я использую это как первый шаг на пути, все же. Например:
public interface SerializableMap<K, V> extends Map<K, V>, Serializable {
// No new methods or anything
}
Следующим шагом также является объявление нового класса:
public class SerilizableHashMap<K, V> extends HashMap<K, V> implements SerializableMap<K, V> {
private static final long serialVersionUID = 4302237185522279700L;
}
Этот класс объявлен для реализации комбинированного интерфейса и, следовательно, может использоваться везде, где требуется один из этих типов. Он расширяет класс, который уже реализует каждый из интерфейсов в отдельности, поэтому нам больше ничего не нужно делать. И теперь у нас есть то, что вы просили. Пример использования:
public static void main(String[] args) {
SerializableMap<String, String> myMap = new SerilizableHashMap<>();
// myMap works as a Map
myMap.put("colour1", "red");
myMap.put("colour2", "green");
// myMap works as a Serializable too
consumeSerializable(myMap);
}
public static void consumeSerializable(Serializable s) {
// So something with the Serializable
}
В большинстве случаев я полагаю, что это излишне, но теперь я, по крайней мере, представил его как вариант.
Ссылка: Что означает «программировать на интерфейс»?