Java泛型笔试真题(含详细答案解析)_第1页
Java泛型笔试真题(含详细答案解析)_第2页
Java泛型笔试真题(含详细答案解析)_第3页
Java泛型笔试真题(含详细答案解析)_第4页
Java泛型笔试真题(含详细答案解析)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java泛型笔试真题(含详细答案解析)整套试题涵盖泛型基础概念、通配符、上下限、泛型擦除、泛型方法、泛型类、常见坑点等核心考点,题型贴合企业真实笔试,难度由浅入深,所有答案附带详细解析,适合刷题复盘、面试备考。一、单项选择题(共8题)1.关于Java泛型的作用,以下说法错误的是()A.编译期类型检查,避免类型转换异常B.减少强制类型转换代码,提升代码简洁度C.可以在运行时获取泛型的真实参数类型D.提升代码复用性,实现通用模板设计2.以下关于泛型擦除的描述,正确的是()A.泛型信息会保留在运行时JVM中B.编译阶段会移除所有泛型参数信息,仅保留原生类型C.泛型擦除只会作用于泛型方法,不作用于泛型类D.带通配符的泛型不会发生擦除3.List<?superNumber>可以接收以下哪个类型的集合()A.List<Integer>B.List<Double>C.List<Object>D.List<Short>4.List<?extendsNumber>集合中,以下操作可以正常执行的是()A.list.add(newInteger(10))B.list.add(newDouble(3.14))C.Numbernum=list.get(0)D.list.add(newObject())5.以下关于泛型类的定义,语法正确的是()A.publicclassTest<T>{}B.publicclassTest[T]{}C.publicclassTest<T,E,>{}D.publicclassTestT{}6.关于泛型方法,下列说法正确的是()A.泛型方法的泛型参数必须和所在类的泛型参数一致B.静态方法可以定义独立的泛型参数C.泛型方法的返回值必须是泛型类型D.普通方法不能使用类定义的泛型参数7.以下两段代码,编译运行结果说法正确的是()List<String>list1=newArrayList();Listlist2=newArrayList<String>();A.两行代码均编译报错B.第一行报错,第二行正常C.第一行正常,第二行正常,均为原生类型集合D.两行代码均正常,无任何隐患8.泛型通配符?和泛型参数T的核心区别是()A.无本质区别,可互相替换使用B.T是确定的类型占位符,?是未知通配符C.?可以用于定义泛型类,T只能用于方法D.T支持上下限限定,?不支持二、填空题(共4题)1.Java泛型的设计原则是编译期校验,__________,所有泛型信息在编译后都会被擦除。2.限定泛型类型为某个类及其子类的语法是__________,限定为某个类及其父类的语法是__________。3.静态方法使用泛型,必须在__________位置声明独立的泛型参数,不能直接使用类的泛型参数。4.List<String>和List<Integer>在JVM运行时的真实类型都是__________,二者不存在继承关系。三、简答题(共3题)1.简述泛型擦除的核心原理,以及泛型擦除会带来哪些常见问题?2.分别说明<?extendsT>和<?superT>的适用场景,为什么会出现读写受限的情况?3.为什么不能用基本数据类型作为泛型参数(如List<int>)?四、编程题(共2题)1.编写一个通用泛型工具方法需求:实现一个静态泛型方法,接收任意类型的List集合,返回集合中的最大值,要求支持所有实现Comparable接口的类型。2.自定义泛型容器类需求:自定义一个泛型类MyContainer,支持存储单个任意类型数据,提供set、get方法,同时提供一个打印数据类型的通用方法。参考答案及详细解析一、单项选择题答案解析1.答案:C解析:Java泛型基于擦除机制,运行时JVM中不存在泛型参数信息,无法直接获取真实泛型类型,只能通过反射间接获取部分信息。ABD均为泛型的核心作用。2.答案:B解析:泛型擦除是Java泛型的核心机制,编译阶段会抹去所有泛型参数、通配符信息,还原为原生类型(如List<String>擦除后为List)。A错误,运行时无泛型信息;C错误,类、方法泛型均会擦除;D错误,通配符泛型同样会擦除。3.答案:C解析:<?superNumber>是下界通配符,代表接收Number类型及Number的所有父类类型。Number的父类只有Object,因此只能接收List<Object>。ABD均为Number的子类,仅能被上界通配符接收。4.答案:C解析:<?extendsNumber>是上界通配符,只读不写。因为集合元素类型不确定(可能是Integer、Double等子类),无法安全添加任何元素;但读取元素可统一用Number类型接收。5.答案:A解析:Java泛型类通过<>声明泛型参数,支持多个参数(逗号分隔),末尾不能加多余逗号。B、D语法格式错误;C末尾存在多余逗号,编译报错。6.答案:B解析:静态方法不属于类实例,无法使用类定义的泛型参数,必须在方法上独立声明泛型。A错误,泛型方法参数可与类参数不同;C错误,返回值可以是普通类型;D错误,普通实例方法可直接使用类泛型参数。7.答案:C解析:JDK7之后支持菱形语法,两行代码均可正常编译。但本质都是原生ArrayList类型,泛型仅在编译期校验,运行时无泛型约束,存在类型转换隐患。8.答案:B解析:T是确定的类型占位符,定义后类型唯一;?是未知通配符,仅用于引用接收,无法用于泛型定义。A错误,二者不能互换;C错误,?不能定义泛型类;D错误,二者均支持上下限限定。二、填空题答案解析1.运行时擦除解析:Java泛型为伪泛型,核心特性为编译期做类型校验,编译完成后擦除所有泛型信息,保证兼容JDK低版本。2.<?extendsT>、<?superT>解析:上界通配符限定子类及自身,下界通配符限定父类及自身,是泛型通配符的标准语法。3.方法返回值前解析:静态泛型方法必须在方法修饰符、返回值之间声明泛型参数,格式:publicstatic<T>Tmethod(){}4.ArrayList解析:泛型擦除后,所有带泛型的集合类型都会还原为原生集合类型,因此List<String>和List<Integer>运行时是同一个类型。三、简答题答案解析1.泛型擦除原理及问题核心原理:Java编译器在编译含有泛型的代码时,会对泛型参数进行检测校验,校验通过后直接移除所有泛型标识,将泛型类型还原为原生类型,同时自动插入强制类型转换代码,保证程序运行正常。常见问题:(1)运行时无法获取泛型真实类型,无法通过泛型参数创建实例;(2)泛型类型数组无法创建,如newT[]编译报错;(3)重载方法因泛型擦除导致冲突,如test(List<String>)和test(List<Integer>)会被识别为同一个方法;(4)泛型类型不能作为异常类、静态变量类型。2.上下限通配符场景及读写受限原因<?extendsT>(上界通配符):适配读取场景,可接收T及其子类的集合。读写限制:只能读、不能写。因为集合元素可能是T的任意子类,编译器无法确定写入元素的具体类型,为保证类型安全,禁止写入操作;读取时可统一用T类型接收。<?superT>(下界通配符):适配写入场景,可接收T及其父类的集合。读写限制:只能写、读取受限。可以写入T及子类元素(向上兼容),但读取时只能用Object类型接收,无法精准获取原类型。3.基本类型不能作为泛型参数的原因(1)Java泛型的参数要求必须是引用类型,仅支持类、接口、包装类;(2)泛型擦除后会统一转为Object类型,而基本数据类型无法向上转型为Object,只有对应的包装类可以;(3)集合存储的都是对象引用,不支持基本类型值存储,因此泛型不允许使用byte、int、char等基本类型,只能用Integer、Byte等包装类。四、编程题答案解析1.通用泛型求集合最大值工具方法java

importjava.util.List;

/**

*泛型工具类:获取集合最大值

*限定T必须实现Comparable接口,保证可比较

*/

publicclassGenericUtil{

//静态泛型方法,<TextendsComparable<T>>限定类型可比较

publicstatic<TextendsComparable<T>>TgetMax(List<T>list){

if(list==null||list.isEmpty()){

thrownewIllegalArgumentException("集合不能为空");

}

Tmax=list.get(0);

for(Tt:list){

if(pareTo(max)>0){

max=t;

}

}

returnmax;

}

//测试方法

publicstaticvoidmain(String[]args){

List<Integer>intList=List.of(12,45,8,96,33);

List<String>strList=List.of("java","python","go","c++");

System.out.println("整数集合最大值:"+getMax(intList));

System.out.println("字符串集合最大值:"+getMax(strList));

}

}核心要点:通过<TextendsComparable<T>>限定泛型类型具备比较能力,适配所有可比较类型,实现通用逻辑。2.自定义泛型容器类java

/**

*自定义泛型容器类,存储任意类型数据

*@param<T>通用数据类型

*/

publicclassMyContainer<T>{

//泛型成员变量

privateTdata;

//设置数据

publicvoidsetData(Tdata){

this.data=data;

}

//获取数据

publicTgetData(){

returndata;

}

//打印数据及类型

publicvoidprintDataType(){

if(data==null){

System.out.println("数据为空");

return;

}

System.out.println("数据值:"+data+",数据类型:"+data.getClass().getSimpleName());

}

//测试

publicstaticvoidmain(String[]args){

//存储字符串类型

MyContainer<String>strContainer=newMyContainer<>();

strContainer.setData("泛型测试");

strContainer.printDataType();

//存储数字类型

MyContainer<Integer>intContainer=newMyContainer<>();

intContainer.setData(666);

intContainer.printDataType();

//存储自定义对象

MyContainer<Person>personContainer=newMyContainer<>();

personContainer.setData(newPerson("张三",20));

personContainer.printDataType();

}

}

//自定义测试实体类

classPerson{

privateStringname;

privateintage;

publicPerson(Stringname,intage){

=name;

this.age=age;

}

@Override

publicStringtoString(){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论