Como fazer uma classe Java que implemente uma interface com dois tipos genéricos?

Eu tenho uma interface genérica

public interface Consumer<E> {
    public void consume(E e);
}

Eu tenho uma classe que consome dois tipos de objetos, então eu gostaria de fazer algo como:

public class TwoTypesConsumer implements Consumer<Tomato>, Consumer<Apple>
{
   public void consume(Tomato t) {  .....  }
   public void consume(Apple a) { ...... }
}

Aparentemente não posso fazer isso.

Eu posso, claro, implementar o despacho sozinho, por ex.

public class TwoTypesConsumer implements Consumer<Object> {
   public void consume(Object o) {
      if (o instanceof Tomato) { ..... }
      else if (o instanceof Apple) { ..... }
      else { throw new IllegalArgumentException(...) }
   }
}

Mas eu estou procurando a solução de verificação de tipo em tempo de compilação e distribuição que os genéricos fornecem.

A melhor solução que consigo pensar é definir interfaces separadas, por ex.

public interface AppleConsumer {
   public void consume(Apple a);
}

Funcionalmente, esta solução está OK, eu acho. É apenas verboso e feio.

Alguma ideia?

questionAnswers(8)

yourAnswerToTheQuestion