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

时间:2015-03-17 11:23:46

标签: java collections instanceof

我有一个具有大量实现的接口MyInterface和一个集合Collection<MyInterface>

现在 如何确保此集合中没有两个元素 相同的类型

可以阻止来自被覆盖的条目

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

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

我目前看到的唯一方法是创建一个抽象类MyAbstractClass。但这似乎有点过分(?)

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:0)

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