“如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据?”javascript
你是否是想到下面的代码?java
package com.cya.test; import java.util.ArrayList; import java.util.List; public class Test{ public static void main(String []args){ List<Integer> list=new ArrayList<>(); Integer in=1; Character ch='c'; Boolean bo=true; list.add(in); list.add(ch); list.add(bo); System.out.println(list); } }
有点Java基础的人都知道上面的代码运行会报错,若是使用Eclipse等开发工具的话在没运行以前就会提示有错了,以下图:程序员
强制运行一波,看下错误提示:web
Exception in thread "main" java.lang.Error: Unresolved compilation problems: The method add(Integer) in the type List<Integer> is not applicable for the arguments (Character) The method add(Integer) in the type List<Integer> is not applicable for the arguments (Boolean) at com.cya.test.Test.main(Test.java:15)
据说英语差的都去当程序员了!!面试
不过不要紧,能get到大致意思就行了,上面的错误大致意思以下:算法
程序在编译时遇到了没法解析的错误,
add方法的参数是Integer类型,没法接收Character类型的参数,
add方法的参数是Integer类型,没法接收Boolean类型的参数编程
上面代码错误的缘由是程序没法经过编译,在编译期出现异常,这和Java是编译性语言(如:C、C++、Delphi、Pascal、Java)有关。与解释性语言(如:Basic、javascript、Python)不一样,Java先将后缀名为.java的源代码文件编译成后缀名为.class的字节码文件,编译期间会进行词法、语法、数据类型、语义分析。上面的错误就是在编译期间进行数据类型分析时类型不匹配形成的。数组
谈到这里,咱们不得不提下Java的异常体系,异常体系结构图以下:服务器
程序在运行过程当中发生因为硬件设备问题、软件设计错误等致使的程序异常事件。(在Java等面向对象的编程语言中)异常自己是一个对象,产生异常就是产生了一个异常对象。网络
如上面的Java异常体系结构图所示,Throwable有两个重要的子类:Exception(异常)和Error(错误),二者都包含了大量的异常处理类。
(一)Error(错误)
程序中没法处理的错误,表示运行应用程序中出现了严重的错误。此类错误通常表示代码运行时JVM出现问题。一般有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。好比说当JVM耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JVM将终止线程。
这些错误是不可查的,非代码性错误。所以,当此类错误发生时,应用不该该去处理此类错误。
(二)Exception(异常)
程序自己能够捕获而且能够处理的异常。
Exception这种异常又分为两类:运行时异常和编译异常。
运行时异常(不受检异常):RuntimeException类及其子类表示JVM在运行期间可能出现的错误。好比说试图使用空值对象的引用(NullPointerException)、数组下标越界(ArrayIndexOutBoundException)。此类异常属于不可查异常,通常是由程序逻辑错误引发的,在程序中能够选择捕获处理,也能够不处理。
看完了Java的异常体系,咱们知道上面代码出现的异常为编译时异常,是必需要处理的,不然没法经过编译阶段,更不要谈运行了。
既然上面代码不可用,那就请出本期的主角---Java的反射机制。
JAVA反射机制是在运行状态中,对于任意一个类,都可以知道这个类的全部属性和方法;对于任意一个对象,都可以调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具备的成员变量和方法;
在运行时调用任意一个对象的方法;
方法名称 | 返回值 | 参数 | 说明 |
---|---|---|---|
getMethods() | Method [] | 无 | 获取包括自身和继承过来的全部的public方法 |
getDeclaredMethods() | Method [] | 无 | 获取自身类中全部的方法(不包括继承的,和访问权限无关) |
getMethod(String methodName,Class<?>... parameterTypes) | Method | methodName:表示被获取方法的名字parameterTypes:表示被获取方法的参数的Class类型,如String.class | 表示获取指定的一个公共的方法(包括继承的) |
getDeclaredMethod(String methodName,Class<?>... parameterTypes) | Method | methodName:表示被获取方法的名字parameterTypes:表示被获取方法的参数的Class类型,如 String.class | 表示获取指定的一个本类中的方法(不包括继承的) |
java中,除了使用new关键字建立对象外,也能够用newInstance()方法建立对象,例如:
Class class1 = Class.forName("java.util.ArrayList"); List list=(List)class1.newInstance();
public Object invoke(Object obj,Object args[])
做用:动态调用Method类表明的方法
obj:从中调用底层方法的对象,必须是实例化的对象
args:用于方法调用的参数,是个Object数组,由于参数有可能有多个
obj能够为空,但必填null,表示同类中的公用方法
args参数能够为空,就是对应方法没有参数
有关Java反射的详细内容我将会专门出一期来说解,这里只对本期用到的几个重要的知识点作概述。
看完了上面的内容,你是否是对面试官的问题有解答思路了呢?下面给出小编本身的想法,若是你有更好的方法,记得跟你们分享哦。
一、建立Integer类型的List集合,用于存放数据。
二、使用对象名.getClass()方法获取Class对象。
三、调用getMethod()方法获取指定的Method。
四、调用invoke()方法将不一样数据类型的数据添加到list集合中。
package com.cya.test; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class Test{ public static void main(String []args) throws Exception{ List<Integer> list=new ArrayList<>(); Object o; //向list中添加Integer类型的数据 Integer integer=1; o=integer; Test.addObjectToList(list, o); //向list中添加String类型的数据 String string="Hello World"; o=string; Test.addObjectToList(list, o); //向list中添加Character类型的数据 Character character='c'; o=character; Test.addObjectToList(list, o); //向list中添加Boolean类型的数据 Boolean boolean1=true; o=boolean1; Test.addObjectToList(list, o); System.out.println(list); } public static List<Integer> addObjectToList(List<Integer> list, Object o) throws Exception{ Class class1=list.getClass(); Method method=class1.getMethod("add", Object.class); method.invoke(list, o); return list; } }
了解更多资源请关注我的公众号:C you again,你将收获如下资源
一、基于web的机票预订系统,基于web的图书管理系统
二、贪吃蛇小游戏源码
三、各种IT技术分享
推荐一:计算机网络中这些高频考题,你还在死记硬背吗?(一),讲述内容:IP地址及其分类,子网掩码的概念,网络号、主机号、直接广播地址计算方法等。
推荐二:计算机网络中这些高频考题,你还在死记硬背吗?(二),讲述内容:局域网接口配置、路由器的静态路由配置、OSPF动态路由协议配置和DHCP服务器配置。
推荐三:用x种方式求第n项斐波那契数,99%的人只会第一种,讲述内容:七种方式求解第N项斐波那契数。
以上就是本期的全部内容了,是否对你有帮助呢?了解更多算法请关注公众号“C you again”。
做者: C you again,从事软件开发 努力在IT搬砖路上的技术小白
公众号: 【C you again】,分享计算机类毕业设计源码、IT技术文章、游戏源码、网页模板、程序人生等等。公众号回复 【粉丝】进博主技术群,与大佬交流,领取干货学习资料
关于转载:欢迎转载博主文章,转载时代表出处
求赞环节:创做不易,记得点赞+评论+转发 谢谢你一路支持