1

假设我有以下代码示例。我有 DataFiller 的接口和它的 2 个实现。每个实现都采用不同类型的容器。

    public interface DataFiller {
        public void fillContainer(Object param1, Object param2 Object container);
    }

    public class InOrderDataFiller implements DataFiller {
        @Override
        public void fillContainer(Object param1, Object param2, Object container) {
            if (container instanceof InOrderContainer) {
                container.setContent1(param1);
                container.setContent2(param2);
            }
        }
    }

    public class ReverseDataFiller implements DataFiller {
        @Override
        public void fillContainer(Object param1, Object param2, Object container) {
            if (container instanceof ReverseContainer) {
                container.setContent1(param2);
                container.setContent2(param1);
            }
        }
    }

为了确保可以填充它们,我需要使用 instanceof 检查容器的数据类型。我想知道,如果有办法,如何拥有更优雅的代码,比如静态类型检查。有没有办法,如何在 DataFiller 的具体实现中指定容器的数据类型?我想要更多这样的代码(当然这不会编译):

    public interface DataFiller {
        public void fillContainer(Object param1, Object param2 Container container);
    }

    public class InOrderDataFiller implements DataFiller {
        @Override
        public void fillContainer(Object param1, Object param2, InOrderContainer container) {
            container.setContent1(param1);
            container.setContent2(param2);
        }
    }

    public class ReverseDataFiller implements DataFiller {
        @Override
        public void fillContainer(Object param1, Object param2, ReverseContainer container) {
            container.setContent1(param2);
            container.setContent2(param1);
        }
    }

是的,我可以完全避免使用接口,而只使用实现。界面应该更像模板,如何编写更多的填充物。我考虑过使用泛型类型,但我不确定它是否是我需要的。DataFillerFactory 是我需要的并在其中执行动态类型检查吗?

4

1 回答 1

5

正如 Sotirios 已经评论的那样,泛型在这里会有一些好处:

public interface DataFiller<T extends Container> {
    void fillContainer(Object param1, Object param2, T container);
}

public class InOrderDataFiller implements DataFiller<InOrderContainer> {
    @Override
    public void fillContainer(Object param1, Object param2, InOrderContainer container) {
        container.setContent1(param1);
        container.setContent2(param2);
    }
}

public class ReverseDataFiller implements DataFiller<ReverseContainer> {
    @Override
    public void fillContainer(Object param1, Object param2, ReverseContainercontainer container) {
        container.setContent1(param2);
        container.setContent2(param1);
    }
}

如果参数类型也依赖于容器类型,您还可以为参数类型引入泛型。

于 2013-09-13T13:48:06.557 回答