我已经编写了以下构建器(简化版本):
public static final class Builder<T extends SigEvents> {
private Class<T> sigEventsType;
private BiFunction<T, MessageExtractor, SigEventsEmitter<T>> emitterMapper;
public Builder<T> forEmitter(@Nonnull Class<T> emitterType, @Nonnull BiFunction<T, MessageExtractor, SigEventsEmitter<T>> emitterMapper) {
this.sigEventsType = emitterType;
this.emitterMapper = emitterMapper;
return this;
}
public SigEventsEmitter<T> buildEmitter() {
//do some stuff which end up setting sigEventLogger and sink
return emitterMapper.apply(sigEventLogger, sink);
}
}
现在,我try 使用它来初始化一个JSFSigEventsEmitter
的实例,该实例声明如下:
public final class JSFSigEventsEmitter extends SigEventsEmitter<JSFCoreSigEvents> {
public JSFSigEventsEmitter(@Nonnull MessageExtractor messageExtractor, @Nonnull JSFCoreSigEvents emitter) {
super(emitter, messageExtractor);
}
}
...其中:
- 类
SigEventsEmitter
被参数化为:public class SigEventsEmitter<T extends SigEvents> {
- 类
JSFCoreSigEvents
是public interface JSFCoreSigEvents extends CoreSigEvents
,它本身就是public interface CoreSigEvents extends SigEvents
,这是我的构建器的基接口
在给定的上下文中,当我try 这样使用构建器时:
SigEventsEmitter<JSFCoreSigEvents> sigEventEmitter = SigEventFactory.newSigEventEmitterBuilder()
.forEmitter(JSFCoreSigEvents.class, ((jsfCoreSigEvents, messageExtractor) -> new JSFSigEventsEmitter(messageExtractor, (JSFCoreSigEvents) jsfCoreSigEvents)))
.buildEmitter();
...我在lambda表达式的返回中得到一个错误,特别是:Bad return type in lambda expression: JSFSigEventsEmitter cannot be converted to SigEventsEmitter<SigEvents>
.
我知道这是因为类型擦除造成的,但我不明白为什么,尤其是如何修复设计.
我的forEmitter
中的T
是T extends SigEvents
的具体类型,我将其作为JSFCoreSigEvents.class
传递,BiFunction
的返回应该是SigEventsEmitter<JSFCoreSigEvents>
,这是我的JSFSigEventsEmitter
的情况.有什么主意吗?
附注:所有的需要是能够在不相互依赖的模块之间使用这个工厂,这就是为什么我需要建立一个通用的SigEvents
和SigEventsEmitter
合同,可以跨模块使用并通过这个构建器构建.