我有一个具有大量实现的接口MyInterface
和一个集合Collection<MyInterface>
。
现在 如何确保此集合中没有两个元素 相同的类型?
可以阻止来自被覆盖的条目 ?
意味着在任何给定的时间点,集合中每个实现只有1个实例。
由于显而易见的原因,我无法在界面中添加默认的equals(Object obj)
实现。
我也不能以任何方式保证每个实现都会覆盖equals(Object obj)
方法(显而易见,但为了彻底起见)。
我目前看到的唯一方法是创建一个抽象类MyAbstractClass
。但这似乎有点过分(?)
答案 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>
来获得至少一个编译时保护。