我正在实现一种特殊类型的Set / Map类。 我想要以下两种方法:
public boolean addAll(Map<K,Integer> map)
public boolean addAll(Iterable<E> elements)
这样可以正常使用。
但是,如果有人创建了一个同时实现Iterable和Map的类,我将遇到麻烦。
我想要的是
public<T extends Map<K, Integer> & Iterable<K>> boolean addAll(T itermap)
然而,java告诉我有两种方法具有相同的擦除功能。
我看到两个糟糕的修复:
1)制作两个名称不同的方法
2)制作如下联合方法
public addAll(Object obj)
if(obj instanceof Map && obj instanceof Iterable)
....
else if(obj instanceof Iterable)
...
else if(obj instanceof Map)
...
}
这最后一个是丑陋的,因为会抛出所有类型的异常(对象没有实现,具有错误泛型的映射等等。
这个问题有更好的解决方案吗?
答案 0 :(得分:1)
指定要与强制转换一起使用的方法(让iterableMap
成为应该作为函数参数的对象,mySpecialSetMap
作为特殊类的实例):
mySpecialSetMap.addAll((Map<K, Integer>) iterableMap);
或
mySpecialSetMap.addAll((Iterable<K>) iterableMap);
创建一个扩展Map<K, Integer>
和Iterable<K>
的新界面:
interface IterableMap<K> extends Map<K, Integer>, Iterable<K> {
}
在扩展Map<K, Integer>
和Iterable<K>
。
解决方案2更优雅,但也许你不能使用它,例如因为“某人”不想实现界面。