java - 通用容器工厂

标签 java generics

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

像这样:

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

最佳答案

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

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

步法不多,但比通用类型 hell 更具表现力。

关于java - 通用容器工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39289681/

相关文章:

c# - 匿名类型 - 是否有任何显着特征?

java - 遍历 hastable 键的枚举会引发 NoSuchElementException 错误

java - 不要转义 th :content tag in Thymeleaf

java - Hadoop 映射器直接写入输出。 (Reducer 写入映射器输出)

C++ 泛型类——分离接口(interface)和实现

c# - 修复通用 UserControl 的嵌入式资源

.net - 将 LINQ to XML 结果转换为 VB.NET 中的通用列表。奇数错误

java - 在 Spring 2.5 <mvc :resources mapping ="/xyz/**" location ="/xyz/"/> is not working

Java/Selenium-如何在下载文件夹中检查下载是否完成

typescript - 从装饰器访问泛型类的静态成员