通用集装箱工厂

时间:2016-09-02 10:02:23

标签: java generics

在我的代码中,我有一个通用的Container接口。容器有一个工厂对象,容器类型由工厂确定。

像这样:

public class HardGenerics {
    public static Container<String> stringContainer(Function<Supplier<String>,Container<String>> factory) {
        return factory.apply(() -> "");
    }

    public static Container<Integer> integerContainer(Function<Supplier<Integer>,Container<Integer>> factory) {
        return factory.apply(() -> 0);
    }

    private interface Container<T> { }

    public static class ListBackedContainer<T> implements Container<T>{
        private final Supplier<T> factory;
        private List<T> list = new ArrayList<T>();
        public ListBackedContainer(Supplier<T> factory) {
            this.factory = factory;
        }
    }

    public static void main(String[] args) {
        create();
    }

    private static void create() {
        stringContainer(ListBackedContainer::new);//extract single parameter
        integerContainer(ListBackedContainer::new);//extract single parameter
    }
}

问题:

我想在我的代码库中传递容器工厂(即ListBackedContainer :: new),但我无法弄清楚如何输入它?

更新

所以要详细说明问题。我不能这样做(或者我无法弄清楚如何):

public static void main(String[] args) {
    create(ListBackedContainer::new);
}

private static void create(Function<Supplier</*what to do*/>, Container</*what to do*/>> factory) {
    stringContainer(factory);
    integerContainer(factory);
}

我想传递一个抽象的通用容器工厂,而不是具体的ListBackedContainer

1 个答案:

答案 0 :(得分:2)

我不确定这是可能的,所以一个合理的解决方法可能是创建一个真正的抽象工厂界面,如下所示:

public static void main(String[] args) {
    create(ListBackedContainer::new);
}

private static void create(ContainerFactory containerFactory) {
    stringContainer(containerFactory::create);
    integerContainer(containerFactory::create);
}

interface ContainerFactory{
    <T> Container<T> create(Supplier<T> itemFactory);
}

不是很多步法,而且比传统类型的地狱更具表现力。