Я хочу реализовать метод, который преобразует коллекцию или карту в массив байтов. Так что я написал этот отрывок:Как я могу дублировать поведение для разных экземпляров интерфейса?
public static byte[] getByteArray(Collection<?> coll) {
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(coll);
} catch (IOException e) {
e.printStackTrace;
} finally {
closeAll(baos, oos);
}
return baos.toByteArray();
}
Потом я обнаружил, что Map doesn't extend Collection, следовательно, я не могу иметь один и тот же метод. Должен ли я действительно писать другой метод с тем же кодом, поскольку у них нет общих интерфейсов? Например:
public static byte[] getByteArray(Map<?, ?> map) {
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(map);
} catch (IOException e) {
e.printStackTrace;
} finally {
closeAll(baos, oos);
}
return baos.toByteArray();
}
Или, может быть, я должен использовать другое решение, например, литье коллекций и карт в Object? Как это:
public static byte[] getByteArray(Collection<?> coll) {
return getByteArray((Object) coll);
}
public static byte[] getByteArray(Map<?, ?> map) {
return getByteArray((Object) map);
}
public static byte[] getByteArray(Object obj) {
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
} catch (IOException e) {
e.printStackTrace;
} finally {
closeAll(baos, oos);
}
return baos.toByteArray();
}
Я считаю, что первое решение, очевидно, плохой выбор, и последний является немного странным.
Есть ли альтернативы?