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中的…...
别再只盯着屏蔽罩了!PCB布局与软件防抖,才是低成本搞定EMC(静电/辐射/脉冲群)的关键
低成本EMC设计实战:PCB布局与软件防抖的黄金法则 当谈到电磁兼容性(EMC)设计时,许多工程师的第一反应往往是增加屏蔽罩、使用昂贵的滤波器或购买高规格的元器件。这种思路虽然有效,但对于资源有限的初创团队和小型项目…...
Nexus Machine架构:边缘计算中稀疏矩阵处理的革新
1. 项目概述:Nexus Machine架构的创新价值在边缘计算和AI推理领域,稀疏矩阵计算(如SpMSpM、SpMV)和图形处理(如BFS、PageRank)等不规则工作负载正面临严峻的性能瓶颈。传统CGRA(Coarse-Grained …...
Meshroom终极指南:免费开源3D重建软件,从照片到三维模型的完整解决方案 [特殊字符]
Meshroom终极指南:免费开源3D重建软件,从照片到三维模型的完整解决方案 🚀 【免费下载链接】Meshroom Node-based Visual Programming Toolbox 项目地址: https://gitcode.com/gh_mirrors/me/Meshroom Meshroom是一款革命性的开源3D重…...
3种方法快速激活Beyond Compare 5:完整密钥生成实战指南
3种方法快速激活Beyond Compare 5:完整密钥生成实战指南 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen Beyond Compare 5是一款功能强大的专业文件对比工具,但30天评估期…...
关键词覆盖不足,图标点击率低于行业均值18.7%?Gemini ASO深度调优全链路拆解
更多请点击: https://intelliparadigm.com 第一章:Gemini App Store优化的现状与挑战 生态碎片化加剧分发效率瓶颈 当前 Gemini App Store 尚未建立统一的开发者认证、审核策略与版本兼容性规范,导致应用在不同 Gemini 原生设备(…...
Windows Cleaner专业级深度优化实战:高效解决C盘空间不足与系统卡顿难题
Windows Cleaner专业级深度优化实战:高效解决C盘空间不足与系统卡顿难题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner Windows Cleaner是一款基于Py…...
汉高2026年第一季度实现稳健有机销售增长
美通社消息:汉高公布了2026年第一季度的销售额,约为50亿欧元,有机(即根据汇率和收购/撤资进行调整后)销售额实现1.7%的稳健增长。两大业务部门均拉动业绩增长,销量与价格均实现正向增长。第一季度欧洲地区的有机销售下降3.4%。在印…...
【DeepSeek API接入实战指南】:20年架构师亲授5大避坑法则与3小时极速接入方案
更多请点击: https://intelliparadigm.com 第一章:DeepSeek API接入开发教程 DeepSeek 提供了稳定、高性能的大模型 API 接口,支持文本生成、对话补全与函数调用等多种能力。开发者需通过 RESTful 方式调用其 OpenAPI v1 接口,所…...
避开这些坑!用Unity做Flappy Bird时,我遇到的5个典型问题及解决方案
避开这些坑!用Unity做Flappy Bird时,我遇到的5个典型问题及解决方案 第一次用Unity复现Flappy Bird这类经典小游戏时,本以为跟着教程一步步操作就能顺利完成,结果从素材导入到最终发布的每个环节都暗藏玄机。特别是当教程只展示&q…...
mmdetection环境搭建避坑指南:从CUDA版本、pip源到Gitee镜像的全流程优化
MMDetection环境搭建全流程优化:从版本匹配到镜像加速的实战指南 在计算机视觉领域,OpenMMLab系列工具包已经成为许多研究者和开发者的首选。作为其中的核心检测库,MMDetection凭借其模块化设计和丰富的预训练模型,极大地简化了目…...
