Java:具有相同数量参数的两个方法签名

时间:2014-06-30 22:07:44

标签: java generics map set

我正在实现一种特殊类型的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)
        ...         
}

这最后一个是丑陋的,因为会抛出所有类型的异常(对象没有实现,具有错误泛型的映射等等。

这个问题有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

解决方案1:

指定要与强制转换一起使用的方法(让iterableMap成为应该作为函数参数的对象,mySpecialSetMap作为特殊类的实例):

mySpecialSetMap.addAll((Map<K, Integer>) iterableMap);

mySpecialSetMap.addAll((Iterable<K>) iterableMap);

解决方案2:

创建一个扩展Map<K, Integer>Iterable<K>的新界面:

interface IterableMap<K> extends Map<K, Integer>, Iterable<K> {

}

在扩展Map<K, Integer>Iterable<K>

的类中实现此接口

解决方案2更优雅,但也许你不能使用它,例如因为“某人”不想实现界面。