211011-构建一个创建Map的工具类来辅助理解可变传参

文章目录
  1. II. 其他
    1. 1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
    2. 2. 声明
    3. 3. 扫描关注

虽说java作为编译语言,但是它本身也提供了很多运行时能力,今天介绍一个非常基础的知识点,可变参数传递

在日常的开发过程中,创建Map对象还是比较常见的,现在我希望写一个工具类,可以非常简单创建并初始化Map对象

因此我们可以实现一个MapUtil工具类,来支持这个场景

1
2
3
4
5
6
7
8
 public static <K, V> Map<K, V> newMap(K k, V v, Object... kv) {
Map<K, V> ans = new HashMap<>();
ans.put(k, v);
for (int i = 0; i < kv.length; i += 2) {
ans.put((K) kv[i], (V) kv[1]);
}
return ans;
}

注意一下上面的实现,kv这个参数就是我们要说的可变参数,在方法内部,kv可以看成是一个数组对象(而且是安全的对象,当不传递时,它的取值也不是null)

在使用可变参数时,下面是一些需要注意的点

可变参数注意与数组参数的冲突

注意下面的两个方法,不能同时出现,直接出现编译错误

1
2
public static <K, V> Map<K, V> newMap(K k, V v, Object... kv)
public static <K, V> Map<K, V> newMap(K k, V v, Object[] kv)

重载的选择

如果只有一个可变参数的方法,newMap("key", "value")不会报错,会直接访问下面这个方法,kv参数为空数组

1
public static <K, V> Map<K, V> newMap(K k, V v, Object... kv)

当出现重载时,即如下

1
2
public static <K, V> Map<K, V> newMap(K k, V v, Object... kv)
public static <K, V> Map<K, V> newMap(K k, V v)

上面两个方法的调用,如果传参只有两个时,会调用哪个?

  • newMap("key", "value") 调用的下面的方法
  • `newMap(“key”, “value”, “k”, “v”) 调用的上面的方法

可变参数传数组会怎样

虽说我们在使用的时候,将可变参数当做数组来使用,但是传递时,若传数组,是否可行呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static <K, V> Map<K, V> newMap(K k, V v, Object... kv) {
Map<K, V> ans = new HashMap<>();
ans.put(k, v);
for (int i = 0; i < kv.length; i += 2) {
ans.put((K) kv[i], (V) kv[1]);
}
return ans;
}

@Test
public void tt() {
Map map = newMap("key", "value", new Object[]{"1", "2"});
System.out.println(map);
}

实际输出如下

1
{1=2, key=value}

从实际测试来看,传数组并没有问题

II. 其他

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

一灰灰blog

QrCode

# Java

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×