将映射传递给一个函数,该函数使用无界外卡指定映射参数

时间:2016-01-14 15:51:14

标签: java generics

我基本上是在尝试检查Java中的private boolean isValid(Map<?,?> map) { return (null != map && map.size() > 0); } 。我的代码如下。

Map<String, String> m = new HashMap<>();
isValid(m);

为什么我不能按如下方式使用此方法?

The method isValid(Map<?,?>) in the type MyClazz is not applicable for the arguments (Map<String,String>)

在Eclipse中,我收到以下错误消息:

isValid( (Map<?,?>) m);

当我写这个问题时,我尝试了以下内容并且“有效”。

[
{"completed":false},
{"completed":false},
{"completed":false},
{"completed":true,"score":1,"answerList":["1"],"QuestionId":75,"startTime":"2016-01-09T16:40:06.153Z","clickNb":1,"endTime":"2016-01-09T16:40:07.844Z"},
{"completed":true,"score":1,"answerList":["1"],"QuestionId":76,"startTime":"2016-01-09T16:40:08.487Z","clickNb":1,"endTime":"2016-01-09T16:40:12.482Z"},
{"completed":true,"score":1,"answerList":["1"],"QuestionId":77,"startTime":"2016-01-09T16:40:13.042Z","clickNb":1,"endTime":"2016-01-09T16:40:17.689Z"}
]

这是为什么?翻阅SO帖子,我遇到了一个“类似”问题,说明了通配符捕获的问题。但这似乎不是这里的问题(没有铸造)。

1 个答案:

答案 0 :(得分:0)

您在Java 8的javac或Eclipse Mars中提供的示例不会发生此错误。您可以尝试刷新项目或清理项目(项目&gt;清理...),否则您的示例不会复制您的实际问题。

一种可能性是您要导入其他Map而不是java.util.Map

此示例编译没有问题,包括javac和Eclipse。

$ cat Demo.java 
import java.util.*;

class Demo {
  // isEmpty() is a better way to check if a Map is empty rather
  // than .size() > 0, which is O(n) for some Map implementations.
  public static boolean nonEmpty(Map<?,?> map) {
    return map != null && !map.isEmpty();
  }

  public static boolean nonZero(Map<?,?> map) {
    return null != map && map.size() > 0;
  }

  public static void main(String[] args) {
    nonEmpty(new HashMap<String, String>());
    nonZero(new HashMap<String, String>());
  }
}

$ javac Demo.java; echo $?
0