Учитывая набор классов, какой лучший способ найти ближайший общий суперкласс?
Например, учитывая следующее:
interface A {}
interface B {}
interface AB extends A, B {}
interface C {}
class AImpl implements A {}
class ABImpl implements AB {}
class ABImpl2 implements A, B {}
class BCImpl implements B, C {}
Я бы ожидал следующего (не исчерпывающего):
commonSuperclass(A, AImpl) == A
commonSuperclass(A, B, C) == Object or null, I'm not picky
commonSuperclass(A, AB) == A
commonSuperclass(AImpl, ABImpl) == A
commonSuperclass(ABImpl, ABImpl2) == either A or B or both, I'm not picky
commonSuperclass(AImpl, ABImpl, ABImpl2) == A
commonSuperclass(ABImpl, ABImpl2, BCImpl) == B
commonSuperclass(AImpl, ABImpl, ABImpl2, BCImpl) == Object
Я предполагаю, что в конце концов смогу это выработать, но кто-то, возможно, решил это уже для таких вещей, как вывод типа в Arrays.asList(...)
. Может ли кто-нибудь указать мне на алгоритм или, еще лучше, какой-нибудь существующий код утилиты?
ETA: Я знаю об API отображения. Это алгоритм (или реализация такого алгоритма), который я ищу.
ETA: И я знаю это DAG. Спасибо. Вы очень умны.
ETA: В топологической сортировке (в ответе EJP): алгоритмы топологической сортировки, с которыми я знаком, требуют от вас:
- начинаем с "корневых" узлов
n
без входящих ребер (т.е. в этом сценарии, предположительноObject
и всех интерфейсов без суперинтерфейсов), которые нужно будет исследовать весь набор, плюс все суперклассы/суперинтерфейсы, собирать) и обрабатывать все ребра(n, m)
(т.е. всеm extends/implements n
, информацию, которую снова нужно было бы изучить весь набор для сбора), или - начинаем с "листовых" узлов
m
без исходящих ребер (т.е. в этом случае все классы/интерфейсыm
, для которых не существует классk extends/implements m
, что снова нужно было бы изучить весь набор собирать) и обрабатывать все ребра(n, m)
(т.е. все классы/интерфейсыm
расширяет/реализует - какую информацию мы имеем).
Возможно один или несколько из этих многопроходных алгоритмов (нормально, предположительно, № 2) - самый эффективный способ сделать это, но это, конечно, не тривиально очевидно. Также вполне возможно наличие однопроходного топологического алгоритма сортировки, с которым я не знаком, или что я просто получил эти алгоритмы неправильно, но в этом случае снова "это в основном своего рода топологическая сортировка" не сразу приводит один для ответа.