在我的代码中,我有一个通用的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
答案 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);
}
不是很多步法,而且比传统类型的地狱更具表现力。