如何复制不同接口实例的行为?

时间:2015-08-12 18:09:14

标签: java interface casting polymorphism

我想实现一个将集合或映射转换为字节数组的方法。所以我写了这个片段:

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();
 }

或者我应该使用其他解决方案,例如将集合和地图投射到对象?像这样:

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();
 }

我认为第一种解决方案显然是一个糟糕的选择,后者有点奇怪。

有替代方案吗?

1 个答案:

答案 0 :(得分:3)

只需使用您的第三个代码段,但不使用前两个方法;它们是不必要的。

ObjectOutputStream.writeObject需要一个Object,你所做的只是用资源清理来包装这种行为。使用Object来解决问题没有任何明显的错误;虽然它通常不是你想要的,但有时也是如此。