繁体   English   中英

Java HashMap作为方法参数-未指定“值”类型

[英]Java HashMap as method parameter - not specifying the “value” type

这是关于Java语法的问题。 我没有被困住。

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

List<String> mylist;

只要不需要访问列表中的元素,就可以将该列表称为List (与List<String> )。
所以我可以有一个像这样的方法:

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

现在假设我有一个HashMap

HashMap<String, String> myhash;

还有一种访问但从不访问值的方法

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

有没有一种很好的方法仅指定HashMap的“键”部分?
HashMap<String>

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

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

您的第一个示例应如下所示

// 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 )使用通配符( List<?> )的很少更新

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

例如:

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

以上是合法的,但是如果您使用foo(aStringList, anIntegerList);调用foo(aStringList, anIntegerList); ,结果将是灾难性的: String列表现在将包含Integer ,所有内容都混乱了。

但是如果你写

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

尽管list1和list2允许传入任何List<XXX> ,但无需显式告知编译器它们是同一类型,则编译器将假定? 在list1和? 在list2中可以代表不同的事物,因此list1.addAll(list2);的编译失败list1.addAll(list2); ,这样可以避免您编写诸如此类的愚蠢内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM