Tengo algunas interfaces que pretendo que terceros implementen en el futuro, y yo mismo proporciono una implementación básica. Solo usaré un par para mostrar el ejemplo.
Actualmente, se definen como
Articulo:
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);
}
Ahora, Item
y ItemStackFactory
puedo prever absolutamente que un tercero necesitará extenderlo en el futuro. ItemStackContainer
También podría extenderse en el futuro, pero no de manera que pueda prever, fuera de mi implementación predeterminada proporcionada.
Ahora, estoy tratando de hacer esta biblioteca lo más robusta posible; esto todavía está en las primeras etapas (pre-pre-alfa), por lo que puede ser un acto de ingeniería excesiva (YAGNI). ¿Es este un lugar apropiado para usar genéricos?
public interface ItemStack<T extends Item> {
T getItem();
int getQuantity();
}
Y
public interface ItemStackFactory<T extends ItemStack<I extends Item>> {
T createItemStack(I item, int quantity);
}
Me temo que esto puede hacer que las implementaciones y el uso sean más difíciles de leer y comprender; Creo que es la recomendación evitar anidar genéricos siempre que sea posible.