java 泛型题目讲解
泛型的知识点
泛型仅存在于编译时期,编译期间JAVA将会使用Object类型代替泛型类型,在运行时期不存在泛型;且所有泛型实例共享一个泛型类
public class Main{public static void main(String[] args){ArrayList<String> list1=new ArrayList<String>();ArrayList<Integer> list2=new ArrayList<Integer>();System.out.println(list1 instanceof ArrayList);//trueSystem.out.println(list2 instanceof ArrayList);//true//System.out.println(list1 instanceof ArrayList<String>);//编译错误,不存在此类型}
}
虽然list1和list2属于不同的类型,但是JVM加载的类仅ArrayList,各泛型实例共享这个类;
泛型的4个限制:
(1)不能new T()
(2)不能创建泛型数组:new T[];
但是可以使用强制类型转换的方法,不过编译器会给出一个警告。
T[] arr=(T[])new ArrayList[10];
(3)在静态环境下不能使用泛型类型的参数
如静态方法、静态变量、静态代码块都不能用泛型类型,原因在于各泛型实例共享一个类,而静态成员时随着类的加载就存在了的。
(4)异常类不能是泛型的。
学习地址
以下是关于Java泛型的一些重要知识点:
泛型类:
使用(或任何字母,但通常使用T、E、K、V等作为约定)来声明泛型类。
在类体内部,可以使用泛型类型参数(如T)来声明属性、方法参数和返回值类型。
泛型参数在编译时会被擦除(类型擦除),因此运行时无法知道具体的泛型类型(除非通过其他方式,如使用instanceof检查对象的具体类型)。
泛型方法:
泛型方法可以在普通类或非泛型类中定义。
使用(或其他字母)在方法返回类型之前声明泛型参数。
泛型参数可以与方法参数或局部变量一起使用。
类型擦除:
在编译时,泛型信息会被擦除,替换为原始类型(如Object)。
这意味着在运行时,泛型参数的实际类型信息是未知的。
为了保持类型安全,编译器会在编译时插入类型转换和类型检查。
泛型限制:
可以使用extends关键字为泛型参数设置上界(即该参数必须是某个类的子类或实现了某个接口)。
类似地,可以使用super关键字为泛型参数设置下界(即该参数必须是某个类的超类或接口)。
静态成员与泛型:
静态成员(包括变量、方法和内部类)不能使用类的泛型参数。
这是因为静态成员是与类关联的,而不是与类的任何特定实例关联的。
如果需要在静态上下文中使用泛型,可以定义泛型静态方法或泛型内部类。
泛型通配符:
使用?表示未知的泛型类型。
? extends T表示未知的类型,但它是T或T的子类。
? super T表示未知的类型,但它是T或T的超类。
泛型与数组:
不能创建泛型数组(如new T[10]),因为类型擦除后无法确保类型安全。
但可以使用泛型集合(如ArrayList)来替代。
泛型与原始类型:
如果没有为泛型类型提供实际的类型参数,编译器会将其视为原始类型(即擦除泛型参数的类型)。
这通常是不安全的,因为它会导致类型检查失效。
泛型与类型推断:
Java编译器可以使用类型推断来自动确定泛型方法的类型参数。
这在使用泛型方法时提高了代码的可读性和简洁性。
泛型与泛型方法的区别:
泛型类是在类声明中定义的,泛型参数用于整个类的所有非静态成员。
泛型方法是在方法声明中定义的,泛型参数仅用于该方法内部。
希望这些知识点能帮助你更好地理解和使用Java泛型。
题目一
下面五条语句中,错误的有_______________________________________________。
(1)ArrayList<String> lists = new ArrayList<String>();
(2)ArrayList<Object> lists = new ArrayList<String>();
(3)ArrayList<String> lists = new ArrayList<Object>();
(4)ArrayList<String> lists = new ArrayList();
(5)ArrayList lists = new ArrayList<String>();
ArrayList<Object> lists = new ArrayList<String>(); // 编译错误
这是错误的。它尝试将lists声明为ArrayList类型,但试图用ArrayList的实例来初始化它。在Java中,泛型不是协变的,所以ArrayList不是ArrayList的子类型。
ArrayList<String> lists = new ArrayList<Object>(); // 编译错误
这同样是错误的。它尝试将lists声明为ArrayList类型,但试图用ArrayList的实例来初始化它。这会导致编译时类型不匹配错误,因为ArrayList不是ArrayList的子类型。
题二
- 下面泛型定义中不正确的是_D_。
A. class Test1 {}
B. interface Test2 {}
C. class Test3{ void test () {}}
D. class Test4{void test () {}}
D. class Test4{void test () {}} 是不正确的。在Java中,你不能在方法内部定义泛型参数 。泛型参数应该在类、接口或方法的返回类型之前定义。正确的泛型方法定义应该是这样的:
class Test4 { <T> void test() {}
}
题三
8. 下列语句编译时不出错的是___________。
A. List<?> c1 = new ArrayList<String> (); c1.add (new Object ());
B. List<?> c2 = new ArrayList<String> (); c2.add (new String ("1"));
C. List<?> c3 = new ArrayList<String> (); c3.add ("1");
D. List<?> c4 = new ArrayList<String> (); c4.add(null);
在Java中,List<?> 是一个未知类型的列表,这被称为通配符捕获(wildcard capture)。由于它是未知的,你不能向这样的列表中添加任何元素(除了null),因为你不能保证列表的实际类型能够容纳你试图添加的元素。
现在,我们来看每一个语句:
-
List<?> c1 = new ArrayList (); c1.add (new Object ());
这个会编译失败。因为 c1 是一个未知类型的列表,你不能向其添加任何具体的对象(除了null)。 -
List<?> c2 = new ArrayList (); c2.add (new String (“1”));
这个也会编译失败。同样的原因,c2 是一个未知类型的列表,你不能向其添加 String 对象。 -
List<?> c3 = new ArrayList (); c3.add (“1”);
这个也会编译失败。c3 是一个未知类型的列表,你不能向其添加 String 对象。 -
List<?> c4 = new ArrayList (); c4.add(null);
这个不会编译失败。因为 null 可以被赋予任何类型的变量,包括未知类型的列表。
因此,只有c4的语句不会编译失败。
题四
- 给定下列代码:
class Shape {}
class Circle extends Shape {}
class Triangle extends Shape {}
public class Test2_9 {public static void main (String [] args) {List<? extends Shape> list1 = new ArrayList< Triangle> ();List<? extends Shape> list2 = new ArrayList<Circle> ();System.out.println(list1 instanceof List< Triangle>); ①System.out.println(list2 instanceof List); ②System.out.println(list1.getClass() == list2.getClass()); ③}
}
则关于语句①②③说法正确的是:___________。
A. ①②③输出结果为true、false、false
B. ①②③输出结果为true、true、true
C. ①编译出错,②③输出结果为false、false
D. ①编译出错,②③输出结果为true、true
选 D ,运行的时候不存在泛型,list1 list2 和 list3运行的时候都是ArrayList
题五
对于泛型类class A { … },T在A类里可以用作不同的地方,在A类类体内,下面语句正确的有_____________________________________________________________。
A. T x;
B. T m1() {return null;}
C. static T y;
D. void m2(T i) {}
E. static T s1() {return null;}
F. static void s2(T i) {}
G. static void s3(T1 i, T1 j){}
对于泛型类 A,我们可以分析每个选项来确定哪些在类体内是正确的。
-
A. T x;
这是正确的。在泛型类的实例成员变量中,我们可以使用泛型参数 T 来声明一个变量。 -
B. T m1() {return null;}
这也是正确的。在泛型类的方法中,我们可以使用泛型参数 T 作为返回类型或参数类型。但是,这里需要注意的是,如果 T 是一个非可空类型(例如一个具体的类或接口),那么直接返回 null 可能会产生编译错误,除非 T 被声明为可以包含 null(例如 T extends SomeType | null,在Java 8及以上版本使用)。但仅从语法的角度看,这个方法是合法的。 -
C. static T y;
这是不正确的。静态成员变量不能是泛型的,因为静态成员是与类关联的,而不是与类的任何特定实例关联的,因此它们不能在声明时引用实例的类型参数。 -
D. void m2(T i) {}
这是正确的。在泛型类的方法中,我们可以使用泛型参数 T 作为参数类型。 -
E. static T s1() {return null;}
这是不正确的。与C选项类似,静态方法不能引用泛型参数,因为它们是类级别的,而不是实例级别的。 -
F. static void s2(T i) {}
这也是不正确的。静态方法不能引用泛型参数。 -
G. static void s3(T1 i, T1 j){}
这实际上是正确的,但它有点误导,因为它定义了一个新的类型参数 T1,而不是使用类的泛型参数 T。不过,从语法的角度看,这个静态方法声明是合法的,它定义了一个泛型静态方法。
总结:
正确的选项是 A, B, 和 D(如果忽略B选项的 null 返回可能导致的类型不匹配问题)。而G选项虽然技术上也是正确的,但它引入了一个新的类型参数 T1,这可能不是题目所期望的。如果考虑仅使用类声明的泛型参数 T,则G选项不应被视为正确。
题目六
List<? extends Comparable<Double>> x8 = new ArrayList<Double> ();
这个句子是没有问题的
题目七
- 关于java泛型,下面描述正确的是___________________________。
A. 泛型的类型参数只能是类类型(包括自定义类),不能是基本类型
B. 泛型的类型参数可以有多个
C. 不能对泛型的具体实例类型使用instanceof操作,如 o instanceof ArrayList,否则编译时会出错。
D. 不能创建一个泛型的具体实例类型的数组,如 new ArrayList[10],否则编译时会出错。
关于Java泛型的描述,正确的选项是:
A. 泛型的类型参数只能是类类型(包括自定义类),不能是基本类型
这个描述是正确的。在Java中,泛型类型参数不能是基本类型(如int, float, char等),而只能是类类型(包括自定义类、接口、数组类型或另一个泛型类型)。
B. 泛型的类型参数可以有多个
这个描述也是正确的。Java支持定义带有多个类型参数的泛型类和方法。例如:class MyClass<T, U> { … }。
C. 不能对泛型的具体实例类型使用instanceof操作,如 o instanceof ArrayList,否则编译时会出错。
这个描述不完全正确。在Java中,你不能直接使用带有泛型参数的instanceof操作,因为类型擦除导致在运行时泛型信息不可用。但是,你可以省略泛型参数,只检查原始类型,如 o instanceof ArrayList。然而,这并不会导致编译错误,只是这样的检查通常没有太多意义,因为它不会告诉你列表中元素的类型。
D. 不能创建一个泛型的具体实例类型的数组,如 new ArrayList[10],否则编译时会出错。
这个描述是正确的。在Java中,你不能创建泛型类型的数组,因为类型擦除和数组协变性的结合会导致运行时类型安全问题。如果你尝试这样做,编译器会报错。
综上所述,正确的选项是A、B和D。
相关文章:

java 泛型题目讲解
泛型的知识点 泛型仅存在于编译时期,编译期间JAVA将会使用Object类型代替泛型类型,在运行时期不存在泛型;且所有泛型实例共享一个泛型类 public class Main{public static void main(String[] args){ArrayList<String> list1new Arra…...
pptx 文件版面分析-- python-pptx(python 文档解析提取)
安装 pip install python-pptx -i https://pypi.tuna.tsinghua.edu.cn/simple --ignore-installedpptx 解析代码实现 from pptx import Presentation file_name "rag_pptx/test1.pptx" # 打开.pptx文件 ppt Presentation(file_name) for slide in ppt.slides:#pr…...

http的basic 认证方式
写在前面 本文看下http的basic auth认证方式。 1:什么是basic auth认证 basic auth是一种http协议规范中的一种认证方式,即一种证明你就是你的方式。更进一步的它是一种规范,这种规范是这样子,如果是服务端使用了basic auth认证…...
【信息系统项目管理师练习题】信息系统治理
IT治理的核心是关注以下哪项内容? a) 人员培训和发展计划 b) IT定位和信息化建设与数字化转型的责权利划分 c) 业务流程的绩效管理 d) IT基础设施的优化利用 答案: b) IT定位和信息化建设与数字化转型的责权利划分 IT治理体系框架的组成部分包括以下哪些? a) IT战略目标、IT治…...

RabbitMQ之顺序消费
什么是顺序消费 例如:业务上产生者发送三条消息, 分别是对同一条数据的增加、修改、删除操作, 如果没有保证顺序消费,执行顺序可能变成删除、修改、增加,这就乱了。 如何保证顺序性 一般我们讨论如何保证消息的顺序性&…...

轻松上手的LangChain学习说明书
一、Langchain是什么? 如今各类AI模型层出不穷,百花齐放,大佬们开发的速度永远遥遥领先于学习者的学习速度。。为了解放生产力,不让应用层开发人员受限于各语言模型的生产部署中…LangChain横空出世界。 Langchain可以说是现阶段…...

【论文笔记】Training language models to follow instructions with human feedback A部分
Training language models to follow instructions with human feedback A 部分 回顾一下第一代 GPT-1 : 设计思路是 “海量无标记文本进行无监督预训练少量有标签文本有监督微调” 范式;模型架构是基于 Transformer 的叠加解码器(掩码自注意…...
嵌入式交叉编译:x265
下载 multicoreware / x265_git / Downloads — Bitbucket 解压编译 BUILD_DIR${HOME}/build_libs CROSS_NAMEaarch64-mix210-linuxcd build/aarch64-linuxmake cleancmake \-G "Unix Makefiles" \-DCMAKE_C_COMPILER${CROSS_NAME}-gcc \-DCMAKE_CXX_COMPILER${CR…...

一、Redis五种常用数据类型
Redis优势: 1、性能高—基于内存实现数据的存储 2、丰富的数据类型 5种常用,3种高级 3、原子—redis的所有单个操作都是原子性,即要么成功,要么失败。其多个操作也支持采用事务的方式实现原子性。 Redis特点: 1、支持…...

C语言动态内存管理malloc、calloc、realloc、free函数、内存泄漏、动态内存开辟的位置等的介绍
文章目录 前言一、为什么存在动态内存管理二、动态内存函数的介绍1. malloc函数2. 内存泄漏3. 动态内存开辟位置4. free函数5. calloc 函数6. realloc 函数7. realloc 传空指针 总结 前言 C语言动态内存管理malloc、calloc、realloc、free函数、内存泄漏、动态内存开辟的位置等…...

最近惊爆谷歌裁员
Python团队还没解散完,谷歌又对Flutter、Dart动手了。 什么原因呢,猜测啊。 谷歌裁员Python的具体原因可能是因为公司在进行技术栈的调整和优化。Python作为一种脚本语言,在某些情况下可能无法提供足够的性能或者扩展性,尤其是在…...

音频可视化:原生音频API为前端带来的全新可能!
音频API是一组提供给网页开发者的接口,允许他们直接在浏览器中处理音频内容。这些API使得在不依赖任何外部插件的情况下操作和控制音频成为可能。 Web Audio API 可以进行音频的播放、处理、合成以及分析等操作。借助于这些工具,开发者可以实现自定义的音…...
【中等】保研/考研408机试-动态规划1(01背包、完全背包、多重背包)
背包问题基本上都是模板题,重点:弄熟多重背包模板 dp[j]max(dp[j-v[i]]w[i],dp[j]) //核心思路代码(一维数组版) dp[i][j]max(dp[i-1][j], dp[i-1][j-v[i]]w[i])//二维数字版 一、 0-1背包 一般输入两个变量:体积&…...
[DEMO]给两个字符串取交集的词语
要求:2个英文字符串中,取相同的大于等于4个字母的词组 比如: 字符串1:" xingMeiLingabcdef WorldHello", 字符串2:"mnjqlup WorldLingLing xingMeiLingHello" 获取交接: [xingMeiLing…...
leetcode53-Maximum Subarray
题目 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出…...
Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之七 简单进行人脸检测并添加面具特效实现
Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之七 简单进行人脸检测并添加面具特效实现 目录...

【go项目01_学习记录06】
学习记录 1 使用中间件1.1 测试一下1.2 push代码 2 URI 中的斜杆2.1 StrictSlash2.2 兼容 POST 请求 1 使用中间件 代码中存在重复率很高的代码 w.Header().Set("Content-Type", "text/html; charsetutf-8")统一对响应做处理的,我们可以使用中…...

Vue中Element的下载
打开vscode让项目在终端中打开 输入npm install element-ui2.15.3 然后进行下载 在node_modules中出现element-ui表示下载完成 然后在输入Vue.use(ElementUI); import Vue from vue import App from ./App.vue import router from ./router import ElementUI from element-ui…...
机器人项目相关
机器人项目相关 1. Nvidia 1.1 Jetson 1.1.1 初步安装Riva教程 llamaspeakJetson AGX Orin踩坑记录(1)安装Riva 参考知乎链接:https://zhuanlan.zhihu.com/p/670007305 1.1.2 NVIDIA Jetson AI Lab 借助 NVIDIA Jetson™ 将生成式 AI…...
Mac升级go版本某种错误情况处理
当看到 "go1.21 is keg-only, which means it was not symlinked into /opt/homebrew" 这样的信息时,意味着Homebrew没有自动为你创建指向新版本Go的符号链接(symlink),因为这是一个旧版本Go的替代版本。 Homebrew中的…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...