Ho alcune interfacce che intendo implementare da terzi in futuro e fornisco personalmente un'implementazione di base. Userò solo un paio per mostrare l'esempio.
Attualmente, sono definiti come
Articolo:
public interface Item {
String getId();
String getName();
}
ItemStack:
public interface ItemStackFactory {
ItemStack createItemStack(Item item, int quantity);
}
ItemStackContainer:
public interface ItemStackContainer {
default void add(ItemStack stack) {
add(stack, 1);
}
void add(ItemStack stack, int quantity);
}
Ora, Item
e ItemStackFactory
posso assolutamente prevedere che alcuni terzi debbano estenderlo in futuro. ItemStackContainer
potrebbe anche essere esteso in futuro, ma non in modi che posso prevedere, al di fuori della mia implementazione predefinita fornita.
Ora sto cercando di rendere questa libreria il più robusta possibile; questo è ancora nelle prime fasi (pre-pre-alfa), quindi potrebbe essere un atto di over engineering (YAGNI). È questo un posto appropriato per usare i generici?
public interface ItemStack<T extends Item> {
T getItem();
int getQuantity();
}
E
public interface ItemStackFactory<T extends ItemStack<I extends Item>> {
T createItemStack(I item, int quantity);
}
Temo che ciò potrebbe finire per rendere le implementazioni e l'uso più difficili da leggere e comprendere; Penso che sia la raccomandazione di evitare di nidificare i generici ove possibile.