查找类集合中最近的公共超类(或超接口)
2022-09-01 12:58:11
给定一组类,找到最近的公共超类的最佳方法是什么?
例如,给定以下内容:
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(...)
伊塔:我知道反射 API。这是我正在寻找的算法(或这种算法的实现)。
伊塔:我知道这是一个DAG。谢谢。你很聪明。
伊塔:关于拓扑排序(在re EJP的答案中):我熟悉的拓扑排序算法要求您:
- 从没有传入边缘的“根”节点开始(即,在这种情况下,大概是所有没有超接口的接口 - 必须检查整个集合,加上所有超类/超接口才能收集),并处理所有边缘(即,所有,必须再次检查整个集合才能收集的信息),或者
n
Object
(n, m)
m extends/implements n
- 从没有传出边缘的“叶”节点开始(即,在这种情况下,所有不存在类的类/接口,同样,人们必须检查整个集合才能收集)并处理所有边缘(即,所有类/接口扩展/实现 - 我们确实拥有哪些信息)。
m
m
k extends/implements m
(n, m)
m
这些多通道算法中的一种或另一种(好吧,大概是#2)可能是最有效的方法,但它肯定不是显而易见的。也完全有可能有一个我不熟悉的单通道拓扑排序算法,或者我只是把这些算法弄错了,但在这种情况下,再次,“它基本上是一种拓扑排序”不会立即导致答案。