在我的代码中,我有一个通用的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);
}
不需要太多的工作,并且比通用类型的地狱更具表现力。