Я думаю, следующее не может быть сделано в Java. Но я был бы рад узнать, как реализовать нечто похожее на это.
Предположим, у нас есть класс C, который уже используется в скомпилированном коде. (Мы не можем ни изменить этот код, ни первоначальное определение C).
Предположим, далее есть интересный код, который можно использовать повторно, если бы только C реализовывал интерфейс I. На самом деле, более или менее тривиально получить D, который является просто C + реализацией методов интерфейса.
Тем не менее, кажется, что, когда у меня есть C, нет никакого способа сказать: я хочу, чтобы вы были D, то есть C, реализующим I.
(Дополнительное замечание: я думаю, что приведение (D) c, где тип времени выполнения c - C, должно быть разрешено, если D - это C, а единственным отличием от C являются добавленные методы. Это должно быть безопасно, не так ли? )
Как можно обойти это бедствие?
(Я знаю шаблон проектирования фабрики, но, похоже, это не решение. Ведь, как только нам удастся создать D во всех местах, где раньше были C, кто-то найдет другой интерфейс J полезным и получит E, расширяющий C реализует J. Но E и D несовместимы, поскольку они оба добавляют различный набор методов к C. Поэтому, хотя мы всегда можем передать E, где ожидается C, мы не можем передать E, где ожидается D. Теперь нам нужен новый класс F, расширяющий C, реализует I, J.)