当前位置: 首页 > news >正文

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泛型。

题目一

下面五条语句中,错误的有_______________________________________________。
(1ArrayList<String> lists = new ArrayList<String>();2ArrayList<Object> lists = new ArrayList<String>();3ArrayList<String> lists = new ArrayList<Object>();4ArrayList<String> lists = new ArrayList();5ArrayList 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的子类型。

题二
  1. 下面泛型定义中不正确的是_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的语句不会编译失败。

题四

  1. 给定下列代码:
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> ();

这个句子是没有问题的
在这里插入图片描述

题目七

  1. 关于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 泛型题目讲解

泛型的知识点 泛型仅存在于编译时期&#xff0c;编译期间JAVA将会使用Object类型代替泛型类型&#xff0c;在运行时期不存在泛型&#xff1b;且所有泛型实例共享一个泛型类 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&#xff1a;什么是basic auth认证 basic auth是一种http协议规范中的一种认证方式&#xff0c;即一种证明你就是你的方式。更进一步的它是一种规范&#xff0c;这种规范是这样子&#xff0c;如果是服务端使用了basic auth认证…...

【信息系统项目管理师练习题】信息系统治理

IT治理的核心是关注以下哪项内容? a) 人员培训和发展计划 b) IT定位和信息化建设与数字化转型的责权利划分 c) 业务流程的绩效管理 d) IT基础设施的优化利用 答案: b) IT定位和信息化建设与数字化转型的责权利划分 IT治理体系框架的组成部分包括以下哪些? a) IT战略目标、IT治…...

RabbitMQ之顺序消费

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

轻松上手的LangChain学习说明书

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

【论文笔记】Training language models to follow instructions with human feedback A部分

Training language models to follow instructions with human feedback A 部分 回顾一下第一代 GPT-1 &#xff1a; 设计思路是 “海量无标记文本进行无监督预训练少量有标签文本有监督微调” 范式&#xff1b;模型架构是基于 Transformer 的叠加解码器&#xff08;掩码自注意…...

嵌入式交叉编译: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优势&#xff1a; 1、性能高—基于内存实现数据的存储 2、丰富的数据类型 5种常用&#xff0c;3种高级 3、原子—redis的所有单个操作都是原子性&#xff0c;即要么成功&#xff0c;要么失败。其多个操作也支持采用事务的方式实现原子性。 Redis特点&#xff1a; 1、支持…...

C语言动态内存管理malloc、calloc、realloc、free函数、内存泄漏、动态内存开辟的位置等的介绍

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

最近惊爆谷歌裁员

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

音频可视化:原生音频API为前端带来的全新可能!

音频API是一组提供给网页开发者的接口&#xff0c;允许他们直接在浏览器中处理音频内容。这些API使得在不依赖任何外部插件的情况下操作和控制音频成为可能。 Web Audio API 可以进行音频的播放、处理、合成以及分析等操作。借助于这些工具&#xff0c;开发者可以实现自定义的音…...

【中等】保研/考研408机试-动态规划1(01背包、完全背包、多重背包)

背包问题基本上都是模板题&#xff0c;重点&#xff1a;弄熟多重背包模板 dp[j]max(dp[j-v[i]]w[i],dp[j]) //核心思路代码&#xff08;一维数组版&#xff09; dp[i][j]max(dp[i-1][j], dp[i-1][j-v[i]]w[i])//二维数字版 一、 0-1背包 一般输入两个变量&#xff1a;体积&…...

[DEMO]给两个字符串取交集的词语

要求&#xff1a;2个英文字符串中&#xff0c;取相同的大于等于4个字母的词组 比如&#xff1a; 字符串1&#xff1a;" xingMeiLingabcdef WorldHello", 字符串2&#xff1a;"mnjqlup WorldLingLing xingMeiLingHello" 获取交接&#xff1a; [xingMeiLing…...

leetcode53-Maximum Subarray

题目 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xf…...

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")统一对响应做处理的&#xff0c;我们可以使用中…...

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踩坑记录&#xff08;1&#xff09;安装Riva 参考知乎链接&#xff1a;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" 这样的信息时&#xff0c;意味着Homebrew没有自动为你创建指向新版本Go的符号链接&#xff08;symlink&#xff09;&#xff0c;因为这是一个旧版本Go的替代版本。 Homebrew中的…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...