<分区>
一些背景
我正在开发一个基于 Lambda 表达式的小型 DI 容器。 我有代表 lambda 的接口(interface):
@FunctionalInterface
public interface LambdaOp<T> {
T resolve();
}
这是(非常简化的)容器:
public class Container {
private final Map<Class<?>, LambdaOp<?>> bindings;
public <T> void bind(Class<T> clazz, LambdaOp<? extends T> lambda) {
bindingd.put(clazz, lambda);
}
public <T> T resolve (Class<T> clazz) {
LambdaOp<?> lambda = bindings.get(clazz);
return (T) lambda.resolve();
}
}
通过这个实现,我可以做类似的事情:
container.bind(
FooInterface.class,
() -> {
FooImplementation foo = new FooImplementation();
foo.setParameterA(paramA);
//do whatever needed to configure it
return foo;
}
);
FooInterface foo2 = container.resolve(FooInterface.class);
它工作正常而且很好,因为编译器不会让我做这样的事情:
container.bind(
FooInterface.class,
() -> new BarImplementation() //compiler error; Bar does not implement Foo
);
问题
绑定(bind) Map 本身不保证 LambdaOp 将具有扩展用作键的类的泛型。
private final Map<Class<?>, LambdaOp<?>> bindings;
因此,我在以下行收到了一个未经检查的警告:
return (T) lambda.resolve();
我想 bind 方法签名足以保证内聚性(是吗?)但仍然感觉有些难闻。
有没有办法以更统一的方式实现它?
编辑:
完整代码在github .我最近做了很多更改,README.md 非常有点过时了。