spring-projects / spring-batch

Spring Batch is a framework for writing batch applications using Java and Spring
http://projects.spring.io/spring-batch/
Apache License 2.0
2.63k stars 2.3k forks source link

Should ClassifierCompositeItemWriter use covariance (extends "keyword" instead "super") in the output type of classifier property? #4592

Open alvarofvr opened 2 weeks ago

alvarofvr commented 2 weeks ago

Expected Behavior The ClassifierCompositeItemWriter should use covariance for classify the items. In the class the classifier property should be defined with an output type of ItemWriter<? extends T>. This way I can use a SubclassClassifier to classify the items.

Current Behavior

ClassifierCompositeItemWriter use contravariance for classify the items. In the class the classifier property is defined with an output type of ItemWriter<? super T>:

public class ClassifierCompositeItemWriter<T> implements ItemWriter<T> {

    private Classifier<T, ItemWriter<? super T>> classifier = new ClassifierSupport<>(null);

Context

I want to classify 2 type of items : PetToCreate extends PetAction{} and PetToUpdate extends PetAction{} and delegate to the corresponding writers: CreatePetWriter implements ItemWriter<PetToCreate> or UpdatePetWriter implements ItemWriter<PetToUpdate>.

So I use a SubclassClassifier:

var typeMap = Map.of(
          PetToCreate.class, createPetWriter,
          PetToUpdate.class, updatePetWriter
);
SubclassClassifier<PetAction, ItemWriter<? extends PetAction>> petActionItemWriterSubclassClassifier = new SubclassClassifier<>(typeMap, null);

But the type checking fails: image

Can someone explain to me the motivation behind this choice, shouldn't it be possible to achieve it?

I also opened a question on StackOverflow: https://stackoverflow.com/questions/78459916/why-classifiercompositeitemwriter-use-contravariance-for-classify-the-items