J'ai certaines interfaces que j'ai l'intention d'implémenter à l'avenir par des tiers et je fournis moi-même une implémentation de base. Je vais seulement utiliser un couple pour montrer l'exemple.
Actuellement, ils sont définis comme
Article:
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);
}
Maintenant, Item
et ItemStackFactory
je peux absolument prévoir qu'un tiers devra l'étendre à l'avenir. ItemStackContainer
pourrait également être étendu à l'avenir, mais pas de manière que je puisse prévoir, en dehors de mon implémentation par défaut fournie.
Maintenant, j'essaie de rendre cette bibliothèque aussi robuste que possible; ceci est encore aux premiers stades (pré-pré-alpha), donc cela peut être un acte de suringénierie (YAGNI). Est-ce un endroit approprié pour utiliser des génériques?
public interface ItemStack<T extends Item> {
T getItem();
int getQuantity();
}
Et
public interface ItemStackFactory<T extends ItemStack<I extends Item>> {
T createItemStack(I item, int quantity);
}
Je crains que cela ne finisse par rendre les implémentations et l'utilisation plus difficiles à lire et à comprendre; Je pense que c'est la recommandation d'éviter autant que possible l'imbrication de génériques.