Kotlin带泛型的Processor接口不接受实现类作为同类型的问题
问题原因与解决方案
类型不匹配的核心原因
你的Processor接口使用了逆变泛型参数(in T: Any),逆变的规则是:若要将Processor<X>赋值给Processor<Y>,必须满足Y是X的子类。换句话说:只有能接受更宽泛输入类型的Processor,才能替代接受更窄输入类型的Processor。
具体到你的代码:
PreProcessor实现的是Processor<String>,它只能处理String类型的输入。而Processor<Any>要求能处理所有Any子类的输入(比如Int、Boolean等),显然PreProcessor做不到这一点,因此无法向上转型为Processor<Any>。PostProcessor实现的是Processor<Result>,同样只能处理Result类型的输入,无法满足Processor<Any>处理任意输入的要求,所以也无法直接赋值。
修正方案
你的处理链逻辑是「PreProcessor处理String得到Result,再传给PostProcessor处理Result」,因此不需要让处理器适配Processor<Any>,只需让装饰器的下一个节点匹配当前处理器的输出类型即可。
修正后的代码
- 调整
PreProcessor的构造参数,接受Processor<Result>?(因为它的输出是Result,下一个处理器需要处理Result):
class PreProcessor( private val processor: Processor<Result>? = null ) : Processor<String> { override fun process(item: String): Result { val result = Result.Success(someInformation = 10) return processor?.process(result) ?: result } }
- 调整
PostProcessor的构造参数(可选,若后续还有处理器,依然处理Result):
class PostProcessor( private val processor: Processor<Result>? = null ) : Processor<Result> { override fun process(item: Result): Result { val result = Result.Error return processor?.process(result) ?: result } }
- 实例化时直接使用
Processor<String>类型(整个链的入口是处理String):
fun processSomeInput(stringToProcess: String) { val processor: Processor<String> = PreProcessor( processor = PostProcessor() ) processor.process(stringToProcess) }
如果需要更灵活的处理链,可以将装饰器设计为泛型类,适配任意输入到Result的转换逻辑,核心原则依然是保证前后处理器的输入输出类型匹配。
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

