[英]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.