即使方法使用更多泛型类型,方法调用也不匹配方法签名

时间:2014-10-24 15:41:00

标签: java method-signature

方法:

public static void incrementMapCounter( Map<Object,Number> tabulationMap, Object key ) {
  Number value = 0;
  if ( tabulationMap.containsKey(key) ) {
    value = tabulationMap.get(key);
  }
  value = value.doubleValue() + new Double(1);
  tabulationMap.put( key, value );
}

调用方法:

Map<String,Long> counts = new HashMap<>();
String key = "foo-bar";
incrementMapCounter( counts, key );

错误(重新格式化):

The method
    incrementMapCounter(Map<Object,Number>, Object)
in ... is not applicable
    for the arguments  (Map<String,Long>, String)

方法签名是匹配类型或更通用:

  • 地图是地图
  • String是一个Object(x2)
  • 长是一个数字

我对这一点感到有点困惑。

2 个答案:

答案 0 :(得分:1)

是后两者。字符串和对象的类型不同。泛型不是协变的,它们是不变的。类型必须完全匹配。与Long和Number相同。

对于您的方法签名,您可以尝试:

public static <T> void incrementMapCounter( Map<? extends T, ? extends Number> map, T key )
{ ...

可以通过以下方式调用:

 HashMap<String, Integer> myMap = new HashMap<>();
 incrementMapCounter( myMap, "warble" );

答案 1 :(得分:0)

泛型是invariant所以参数需要匹配传入的参数,以便可以将值添加到Collection

public static void incrementMapCounter(Map<String, Long> map, Object key) {