Non è possibile fatelo direttamente in una classe, poiché la definizione di classe seguente non può essere compilata a causa della cancellazione di tipi generici e di dichiarazioni di interfacce duplicate.
class TwoTypesConsumer implements Consumer<Apple>, Consumer<Tomato> {
// cannot compile
...
}
Qualsiasi altra soluzione per l'imballaggio lo stesso consumare le operazioni in una classe richiede di definire la classe come:
class TwoTypesConsumer { ... }
che è inutile come è necessario ripetere/duplicare la definizione di entrambe le operazioni e che non sarà referenziato dall'interfaccia. Farlo è una piccola e cattiva duplicazione del codice che sto cercando di evitare.
Questo potrebbe essere un indicatore anche che c'è troppa responsabilità in una classe di consumare 2 oggetti diversi (se non sono accoppiati).
Tuttavia quello che sto facendo e cosa si può fare è aggiungere oggetto factory esplicito per creare utenze collegate nel seguente modo:
interface ConsumerFactory {
Consumer<Apple> createAppleConsumer();
Consumer<Tomato> createTomatoConsumer();
}
Se in realtà questi tipi sono davvero accoppiati (legati) poi ho lo consiglierei a creare un'implementazione in tal modo:
class TwoTypesConsumerFactory {
// shared objects goes here
private class TomatoConsumer implements Consumer<Tomato> {
public void consume(Tomato tomato) {
// you can access shared objects here
}
}
private class AppleConsumer implements Consumer<Apple> {
public void consume(Apple apple) {
// you can access shared objects here
}
}
// It is really important to return generic Consumer<Apple> here
// instead of AppleConsumer. The classes should be rather private.
public Consumer<Apple> createAppleConsumer() {
return new AppleConsumer();
}
// ...and the same here
public Consumer<Tomato> createTomatoConsumer() {
return new TomatoConsumer();
}
}
il vantaggio è che la classe factory conosce entrambe le implementazioni, v'è uno stato condiviso (se necessario) e si può tornare ai consumatori più accoppiate, se necessario. Non esiste alcuna dichiarazione del metodo di consumo che non sia derivata dall'interfaccia.
Si prega di notare che ogni consumatore potrebbe essere indipendente (ancora privato) di classe se non sono completamente correlati.
Lo svantaggio di questa soluzione è una complessità di classe superiore (anche se questo può essere un unico file java) e per accedere consumare metodo avete bisogno di uno più chiamata così, invece di:
twoTypesConsumer.consume(apple)
twoTypesConsumer.consume(tomato)
avete:
twoTypesConsumerFactory.createAppleConsumer().consume(apple);
twoTypesConsumerFactory.createTomatoConsumer().consume(tomato);
in sintesi si può definire 2 consumatori generici in una classe di livello superiore con 2 classi interne ma in caso di chiamate è necessario ottenere prima un riferimento di appropriarsi attuazione consumatore in quanto questo non può essere semplicemente un oggetto consumatore.
Perché sono necessarie due interfacce generiche dello stesso tipo di base? – akarnokd
A causa della cancellazione del tipo non è possibile farlo. Tenerlo in due classi diverse che implementa il consumatore. Rende più piccole classi ma mantiene generico il codice (non usare la risposta accettata, rompe l'intero concetto ... non puoi trattare il TwoTypesConsumer come un consumatore, che è BAD). –