Tenho algumas interfaces que pretendo que terceiros implementem no futuro e forneço uma implementação básica. Vou usar apenas alguns para mostrar o exemplo.
Atualmente, eles são definidos como
Item:
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);
}
Agora, Item
e ItemStackFactory
posso absolutamente prever que terceiros precisem estendê-lo no futuro. ItemStackContainer
também pode ser estendido no futuro, mas não das maneiras que posso prever, fora da implementação padrão fornecida.
Agora, estou tentando tornar essa biblioteca o mais robusta possível; isso ainda está nos estágios iniciais (pré-pré-alfa), portanto pode ser um ato de excesso de engenharia (YAGNI). Este é um local apropriado para usar genéricos?
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);
}
Receio que isso possa tornar as implementações e o uso mais difíceis de ler e entender; Eu acho que é a recomendação para evitar aninhar genéricos sempre que possível.