Полагаю, вы хотите иметь класс Supplier
и класс Consumer
, которые реализуют дженерики, чтобы вы могли реализовать Supplier<Clothes>
или Consumer<Food>
или что-то еще в вашем классе Warehouse
?
Вы можете попробовать что-то в этом роде.Я полагаю, это более вероятная реализация фабрики генериков.
public class Supplier<T>{
//You might decide you need an actual constructor that does something
public Supplier(){}
public T supplyItem(){
return new T();
}
}
Потребитель может выглядеть так ...
public class Consumer<T>{
private int consumeCount = 0;
//You might decide you need an actual constructor that does something
public Consumer(){}
public void consumeItem(T item){
consumeCount++;
}
public int consumeCount(){
return consumeCount;
}
}
И, наконец, ваш склад может включать что-то вроде ...
Supplier<Integer> integerSupplier = new Supplier<Integer>();
Consumer<Integer> integerConsumer = new Consumer<Integer>();
Integer i = integerSuppler.supplyItem();
integerConsumer.consumeItem(i);
integerConsumer.consumeItem(integerSupplier.supplyItem());
System.out.println(integerConsumer.consumeCount());
Который мы ожидаем напечатать "2".Вы также можете изменить свои методы потребления, чтобы взять экземпляр Object
вместо T
, и использовать instanceOf
, чтобы либо справиться с этим, либо сказать: «Не могу потреблять это, не моя вещь».С некоторыми instanceOf
вам следует быть осторожнее, поэтому, если вам не нужно быть таким надежным, я бы об этом не беспокоился.http://www.javapractices.com/topic/TopicAction.do?Id=31 имеет хорошее объяснение, почему.
РЕДАКТИРОВАТЬ: Может показаться, что Потребитель и Поставщик взаимодействуют друг с другом, особенно если у вас есть строка, как integerConsumer.consumeItem(integerSupplier.supplyItem());
, но важно отметить,что Потребитель и Поставщик на самом деле не взаимодействуют друг с другом.Поставщик просто генерирует новый Объект, а Потребитель воспринимает это как аргумент.В то время как Склад знает о существовании Потребителя и Поставщика, Потребитель не знает о существовании Поставщика и наоборот.