java学习-list集合有泛型情况添加多种类型数据

//来自一道面试题的分析,大概的意思是,如果让你在集合中增加不同类型的数据,你会怎么做?
 
package cn.cnsy123.ypf.thread.test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

public class Demo1 {

	public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ObjectTOIntegrException {
		ArrayList<Integer> list = new ArrayList<Integer>();
		list.add(123);
		Class<?> clz = list.getClass();
		Method method = clz.getMethod("add", Object.class);
		method.invoke(list, "qwe");
		method.invoke(list, "haha");
		System.out.println(list);

	}

}

解释,初始创建一个空的list集合,暂时将泛型定义为Integer整形数据类型,

ArrayList<Integer> list = new ArrayList<Integer>();

在java7的新特性中,可以这么定义

ArrayList<Integer> list = new ArrayList<>();

并增加几个符合泛型的数据,比如:

list.add(111);

list.add(222);

list.add(333);

list.add(444);


然后,怎么解决增加其他数据类型的数据呢?

一般会直接这么做:

list.add("hello world");

可以这样会发现编辑器,会给我们这样的提示


就是说这个方法不能将String类型的数据作为参数增加进List集合中,

那我们怎么办呢?

这时,我们可以想一想class文件中的编码格式是怎么样的


我们会发现在编译成class文件时泛型,被javaJVM剔除了,也就是说在编写java代码时有泛型


而在编译成class文件时,泛型被去除了,

那么我们所知道的什么可以直接在编写过程中就可以实现这种方式呢?

当然是java反射了,我们可以想想怎么做呢?


首先,先得到list集合的class对象,也就是获取ArrayList类的class对象,


Class<?> clz = list.getClass();

当然也可以是这样的:

Class<ArrayList<Integer>> clz = (Class<ArrayList<Integer>>) list.getClass();

然后再获取list集合的add方法,

Method method = clz.getMethod("add", Object.class);

这里有两个参数,第一个是要获取的方法的名称;第二个是要获取的方法的方法参数类型,

这里的方法参数类型,我们就可以用来做点文章了,

如果我们只想有Integer类型的数据,那么就是Integer的class对象,也就是Integer.class;

Method method = clz.getMethod("add", Integer.class);

如果我们只想是其他类型的数据,那么就是其他类型的class对象;

Method method = clz.getMethod("add", String.class);

Method method = clz.getMethod("add", Boolean.class);

......

......

这里我们要的是可以增加所有的类型,所以我们将之定义成Object超类的class对象即可;

第三步,使用Method方法的invoke方法去进行赋值,

method.invoke(list, "haha");

method.invoke(list, 'd');

method.invoke(list, true);

method.invoke(list, 1000000L);

.......

第四步,将我们的结果展示出来,也就是上面的三步,已经实现了我们想要的结果,所以

直接使用输出语句打印到控制台上即可。

System.out.println(list);

最终结果展示,





谢谢大家的阅览,有问题请在下方评论区留言,感谢大家的支持。

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵喵先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值