【问题标题】:Java HashMap as method parameter - not specifying the "value" typeJava HashMap 作为方法参数 - 不指定“值”类型
【发布时间】:2016-08-19 11:14:05
【问题描述】:

这是一个关于 Java 语法的问题。我没有卡住。

对于列表,假设我有一个字符串列表。

List<String> mylist;

只要我不需要访问列表中的元素,我可以将此列表称为List(相对于List&lt;String&gt;)。
所以我可以有一个看起来像这样的方法:

public int listSize(List list) {
    return list.size();
}

现在假设我有一个HashMap

HashMap<String, String> myhash;

还有一个方法访问 key 但从不访问 value

public boolean hashContainsKey(HashMap<String, String> hash, String key) {
    return hash.containsKey(key);
}

有没有一种只指定 HashMap 的“关键”部分的好方法?
HashMap&lt;String&gt; 之类的东西?

【问题讨论】:

  • 看keySet方法
  • As long as I don't need to access the elements in my list, I can refer to this list as a List (versus List&lt;String&gt;). ...为什么?这有什么改善?
  • @Rogue 这不是很明显吗?因此,List&lt;Integer&gt;List&lt;SecurityManager&gt;List&lt;Custom&gt; 都将被接受,而无需重新定义几种方法或使用繁重的 Generic 语法。

标签: java syntax hashmap


【解决方案1】:

我希望你的例子只是为了展示你的想法而不是你要写的东西,因为写这样的方法是毫无意义的。

一种方法是对类型参数使用通配符:

你的第一个例子应该是这样的

// Should be static in this example
public static int listSize(List<?> list) {
    return list.size();
}

另一个应该是:

// It is, imho, irrational to deal with HashMap specifically, 
// and again, this should be static
public static boolean mapContainsKey(Map<String, ?> map, String key) {
    return map.containsKey(key);
}

甚至更好:

public <T> static boolean mapContainsKey(Map<T, ?> map, T key) {
    return map.containsKey(key);
}

关于为什么使用通配符 (List&lt;?&gt;) 而不是原始类型 (List) 的一些更新

在 OP 的示例中,差异可能并不明显。但是它们并不等价。

例如:

public void foo(List list1, List list2) {
  list1.addAll(list2);
}

上面是合法的,但是如果你用foo(aStringList, anIntegerList);调用它,结果将是灾难性的:String列表现在将包含Integers,一切都搞砸了。

但是如果你写

public void foo(List<?> list1, List<?> list2) {
  list1.addAll(list2);
}

虽然 list1 和 list2 允许任何 List&lt;XXX&gt; 传入,但无需您明确告诉编译器它们属于同一类型,编译器将假定 list1 中的 ? 和 list2 中的 ? 可以代表不同的东西,因此无法编译list1.addAll(list2);,从而避免您编写这样的愚蠢内容。

【讨论】:

  • 否决票的任何理由?通配符应该是 Java 泛型中让某些类型参数匹配“任何东西”的方式,这正是 OP 所要求的。
  • static 与非静态是我猜的一场大辩论。好吧,Map&lt;String, ?&gt; 就是我要找的。但是如果既编译又工作,List&lt;?&gt; 带来了什么List
  • 显然List 是为了遗留目的。所以我可能应该使用List&lt;?&gt;stackoverflow.com/questions/6783316/list-vs-listobject
  • 在您的情况下,原始类型和通配符的区别可能并不明显。例如,当您处理超过 1 个列表时,它实际上会执行类型检查。查看我的更新
  • 对于static 的辩论,我明确表示它应该是静态的在这个例子中,我认为这没有什么值得商榷的:它显然只是在努力输入参数,与实例本身无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多