如何确保集合仅包含接口的每个实现之一

How to make sure a collection only contains one of each of the implementations of an interface

我有一个接口 MyInterface,其中有许多实现和一个集合 Collection<MyInterface>

现在我如何确保没有两个此集合中的元素 属于同一类型?

并且如何我可以防止来自的任何条目被覆盖?

这意味着在任何给定的时间点,集合中的每个实现只有 1 个实例。

出于显而易见的原因,我无法向界面添加默认的 equals(Object obj) 实现。 我也不能以任何方式保证每个实现都会覆盖 equals(Object obj) 方法(很明显,但为了彻底起见在这里)。

我目前看到的唯一方法是创建摘要Class MyAbstractClass。但这似乎有些矫枉过正(?)

您可以使用 Map<Class<?>,MyInterface> 而不是 Collection<MyInterface>。关键是实施 Class。这将确保最多可以将每种类型的一个实例添加到 Map.

以下是初始化地图并向其添加条目而不覆盖现有条目的方法:

Map<Class<?>,MyInterface> map = new HashMap<>();
...
if (!map.containsKey(obj.getClass())) {
    map.put(obj.getClass(),obj);
}

此外,如果您愿意,请参阅 Collections.newSetFromMap 以了解如何实现由地图支持的集合。请注意,在运行时,您的地图可能会填充各种 类 作为键。您可以使用 Map<Class<? extends MyInterface>, MyInterface> 至少获得编译时保护。