这是关于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);
,结果将是灾难性的:String
列表现在将包含Integer
s,所有内容都混乱了。
但是如果你写
public void foo(List<?> list1, List<?> list2) {
list1.addAll(list2);
}
尽管list1和list2允许任何List<XXX>
传入,但无需您明确告诉编译器它们是同一类型,编译器将假定?
in list1和?
in list2可以表示不同的内容,从而使的编译失败list1.addAll(list2);
,从而避免了编写这样的愚蠢的事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句