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

加布里埃尔

这是关于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>什么?

阿德里安·申(Adrian Shum)

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

一种方法是对类型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列表现在将包含Integers,所有内容都混乱了。

但是如果你写

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

尽管list1和list2允许任何List<XXX>传入,但无需您明确告诉编译器它们是同一类型,编译器将假定?in list1和?in list2可以表示不同的内容,从而使的编译失败list1.addAll(list2);,从而避免了编写这样的愚蠢的事情。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java Hashmap-通过在方法中传递“值”作为参数来获取/检索“键”

在未指定类型参数的情况下无法将Java 8方法与lambda参数一起使用

当未指定类型参数时,为什么Java泛型原始类会擦除对象的所有泛型?

方法重载对象和未指定的类型

如何在Java中将类型作为方法参数传递

泛型类型作为Java方法中的参数

将方法(java)中的值作为参数传递

如何只允许某些值作为Java中方法的参数?

是否在每次未指定对象类型时构造默认参数?

将类型参数作为类型参数的类传递给Java中的泛型方法

没有方法签名:java.util.ArrayList.getAt()适用于参数类型:(HashMap)值:[[:]]

java:使用Raw类型作为方法参数会擦除参数成员中所有已参数化的类型信息

Kotlin 中的 Java 泛型:在 Kotlin 中使用 Java 原始类型作为方法参数

Java Pass方法作为参数

Java 类作为方法参数

具有单个参数的Java方法是否可以接收HashMap <String,Integer>和HashMap <Long,Integer>的值?

将Java方法参数作为最终参数

将字段名称/类型作为参数传递给Java中的方法

Java如何通过以原始类型作为参数的反射来调用方法

将Java与Matlab结合使用:将Class类型作为方法参数传递

Java-如何将方法的返回类型作为参数传递?

Java:将对象类型的 Array 和 ArrayList 存储在 ArrayList 中(作为参数传递给方法)

类类型作为Java中的参数

在 Java 中传递一个 HashMap 作为参数

Java ArrayList <JTextField>作为Java方法的参数

如何只允许某些int值作为Java中方法的参数?

通用类型作为方法参数

我想实现将参数作为类对象并将参数定义为Class <T>或T类型的通用java方法

当未指定type参数时,为什么Scala推断底部类型?