在我的代码中,我有一个通用的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

最佳答案

我不确定是否可行,因此合理的解决方法可能是创建一个真正的抽象工厂接口,如下所示:

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


不需要太多的工作,并且比通用类型的地狱更具表现力。

07-26 07:08
查看更多