gpt4 book ai didi

Java HashMap 作为方法参数 - 未指定 "value"类型

转载 作者:行者123 更新时间:2023-12-01 09:35:47 27 4
gpt4 key购买 nike

这是一个关于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 的“key”部分?
类似 HashMap<String>

最佳答案

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

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

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

// 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>传入时,如果您没有明确告诉编译器它们属于同一类型,编译器将假定 ?在 list1 和 ? 中list2 中可以代表不同的东西,因此 list1.addAll(list2); 的编译失败,这可以避免你写出这样的愚蠢的东西。

关于Java HashMap 作为方法参数 - 未指定 "value"类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38948750/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com