У меня есть некоторые интерфейсы, которые я намерен внедрить сторонними разработчиками в будущем, и я сам предоставляю базовую реализацию. Я буду использовать только пару, чтобы показать пример.
В настоящее время они определены как
Вещь:
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);
}
Сейчас, Item
и ItemStackFactory
я могу совершенно предвидеть, что некоторые сторонние компании будут расширять его в будущем. ItemStackContainer
может также быть расширен в будущем, но не так, как я могу предвидеть, за пределами моей реализации по умолчанию.
Теперь я пытаюсь сделать эту библиотеку максимально надежной; это все еще находится на ранних стадиях (пре-пре-альфа), так что это может быть актом чрезмерной инженерии (YAGNI). Это подходящее место для использования дженериков?
public interface ItemStack<T extends Item> {
T getItem();
int getQuantity();
}
И
public interface ItemStackFactory<T extends ItemStack<I extends Item>> {
T createItemStack(I item, int quantity);
}
Я боюсь, что это может в конечном итоге сделать реализацию и использование более трудными для чтения и понимания; Я думаю, что это рекомендация избегать вложенных дженериков, где это возможно.