【发布时间】:2012-03-21 00:55:55
【问题描述】:
给定一组类,找到最近的公共超类的最佳方法是什么?
例如,给定以下内容:
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's answer 中):我熟悉的拓扑排序算法要求您:
- 从“根”节点
n开始,没有传入边(即,在这种情况下,可能是Object和所有没有超接口的接口——必须检查整个集合,加上所有超类/超接口,收集)并处理所有边缘(n, m)(即所有m extends/implements n,再次必须检查整个集合以收集的信息),或 - 从“叶”节点
m开始,没有出边(即,在这种情况下,所有类/接口m不存在类k extends/implements m,这又一次必须检查整个集合收集)并处理所有边缘(n, m)(即所有类/接口m扩展/实现——我们确实拥有这些信息)。
这些多遍算法中的一种或另一种可能是最有效的方法(好吧,大概是#2),但它肯定不是很明显。也完全有可能存在我不熟悉的一次性拓扑排序算法,或者我只是把这些算法弄错了,但在那种情况下,“它基本上是一种拓扑排序”不会立即导致一个答案。
【问题讨论】:
标签: java inheritance