Java泛型浅析

手把手教你用ES8311芯片搞定智能音箱TTS播放(附完整寄存器配置清单) 本文详细介绍了如何使用ES8311音频编解码芯片实现智能音箱TTS播放功能,包括芯片特性、硬件连接、寄存器配置及调试技巧。通过完整的寄存器配置清单和实战经验,帮助开发者快速掌握ES8311在智能音箱中的应用,优化音频输出质量和低功耗设计。 阅读详情


一句话理解


泛型是一种检查机制,使得在编译时检测出错误,而不是运行时。


优点


加强安全性。


知识要点(详细)


以下例子来源:Java语言程序设计(进阶篇)

定义的泛型类会在后续的例子中持续使用


1.定义泛型类&接口

import java.util.ArrayList;

//定义泛型类
public class GenericStack <E>{

	
	ArrayList<E> list = new ArrayList<>();
	public int getSize(){
		return list.size();
	}
	public E peek(){
		return list.get(getSize()-1);
		
	}
	public void push(E o){
		list.add(o);
	}
	public E pop(){
		E o = list.get(getSize()-1);
		list.remove(getSize()-1);
		return o;
	}
	public boolean isEmpty(){
		return list.isEmpty();
	}
	@Override
	public String toString() {
		return "stack:" + list.toString() ;
	}
	
	
}
//应用泛型类添加元素,再输出
public class GenericDemo {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GenericStack<String> stack1 = new GenericStack<>();
		stack1.push("London");
		stack1.push("Paris");
		stack1.push("Berlin");
		
		GenericStack<Integer> stack2 = new GenericStack<>();
		stack2.push(1);
		stack2.push(2);
		stack2.push(3);
		
		System.out.println(stack1.pop());
		System.out.println(stack1.pop());
		System.out.println(stack1.pop());
		System.out.println();
		System.out.println(stack2.pop());
		System.out.println(stack2.pop());
		System.out.println(stack2.pop());
		System.out.println();

	}

}

注意这是一个栈类


2.定义泛型方法

package test;

public class GenNewDemo {

	//定义泛型方法
	public static <E> void print (E[] list){
		for(int i = 0;i<list.length;i++){
			System.out.print(list[i]+ " ");
			System.out.println();
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Integer[] integeres = {1,2,3,4,5};
		String[] strings = {"London","Paris","New York"};
		
		print(integeres);
		System.out.println();
		
		//以下三种输出方式都是正确的
		print(strings);
		System.out.println();
		GenNewDemo.print(strings);
		System.out.println();
		GenNewDemo.<String>print(strings);
	}

}


注意:

是可以为静态方法定义泛型类型。


3.受限泛型&非受限泛型

受限泛型:泛型指定为另外一种类型的子类型。eg:<E entends GenericOperation> (GenericOperation是一个自定义类)

非受限泛型:假设有一个<E>,它就等同于<E entends Object>


4.原始类型及向后兼容

原始类型:没有指定具体类型的泛型类和泛型接口被称为原始类型。

eg:

GenericStack stack = new GenericStack();
//大体等价于
GenericStack<Object> stack = new GenericStack<Object>();
像这样不带类型参数的泛型类就是原始类型。

注意:原始类型是不安全的。

5.通配泛型(重点)

通配泛型分类:

(1)非受限通配     ?

和? exends Object是一样的

(2)受限通配       <? extends T >

表示T或T的一个子类型

(3)下限通配       <? super T >

表示T或T的一个父类型


?应用举例:

package test;

public class WildCardNeedDemo {

	//找到stack中的最大数字
	public static double max(GenericStack<? extends Number> stack){
		double max = stack.pop().doubleValue();
		while(!stack.isEmpty()){
			double value = stack.pop().doubleValue();
			if(value>max){
				max = value;
			}
		}
		return max;
	}
	
	public static  void print (GenericStack<Object> stack){
		while(!stack.isEmpty()){
			System.out.print(stack.pop() + " ");
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GenericStack<Integer> intStack = new GenericStack<>();
		intStack.push(1);
		intStack.push(2);
		intStack.push(-2);
		
		print(intStack);
	}

}


错误分析:虽然Integer是Object的子类型,但是GenericStack<Integer>不是GenericStack<Object>的子类型

修改代码为


运行结果



<? extends T >应用举例:

package test;

public class WildCardNeedDemo {

	//找到stack中的最大数字
	public static double max(GenericStack<Number> stack){
		double max = stack.pop().doubleValue();
		while(!stack.isEmpty()){
			double value = stack.pop().doubleValue();
			if(value>max){
				max = value;
			}
		}
		return max;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GenericStack<Integer> intStack = new GenericStack<>();
		intStack.push(1);
		intStack.push(2);
		intStack.push(-2);
		System.out.println("The max number is : " + max(intStack));
	}

}


错误分析:虽然Integer是Number的子类型,但是GenericStack<Integer>不是GenericStack<Number>的子类型,所以要用通配泛型去解决问题。


修改代码为

运行结果



<? super T >应用举例:

package test;

public class SuperWildCardDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GenericStack<String> stack1 = new GenericStack<>();
		GenericStack<Object> stack2 = new GenericStack<>();
		stack2.push("Java");
		stack2.push(2);
		stack1.push("Sun");
		add(stack1,stack2);
		print(stack2);
		}

	private static <T> void add(GenericStack<T> stack1, GenericStack<? super T> stack2) {
		while(!stack1.isEmpty()){
			stack2.push(stack1.pop());
		}
	}

	public static  void print (GenericStack<?> stack){
		while(!stack.isEmpty()){
			System.out.println(stack.pop() + " ");
		}
	}
}

运行结果



6.消除泛型

泛型在编译时,一旦编译器确认泛型类型是安全使用的,就会将它转换为原始类型。

例如:


确认安全后,编译器转换为Object类型代替泛型类型




7.泛型的限制


(1)不能使用new E();

   eg:E object = new E();

(2)不能使用new E[ ]

   eg:E[ ] elements = new E[ ];

(3)在静态上下文中不允许类的参数是泛型类型

由于泛型类的所有实例都有相同的运行时类,所以泛型类的静态变量和方法是被它的所有实例共享,因此,在静态方法、数据域或者初始化语句中,为类引用泛型类型参数是非法的,非法代码举例如下:

public class Test<E>{
		public static void m(E o1){
			//Illegal
		}
		public static E o1;//Illegal
		static {
			E o2;//Illegal
		}
	}


(4)异常类不能是泛型的

必须添加try/catch

泛型类不能扩展java.lang.Throwable

下面类的声明是非法的:

public class MyException<T> extends Exception{
		
	}
如果允许,要为MyException<T> 添加一个catch语句

try{
			
		}catch( MyException<T> ex){
			
		}

JVM必须检查这个try句子抛出的异常,来确定是否与catch子句中指定的类型匹配,但是这是不可能的,因为运行时类型信息是不可得的。



总结


1.泛型具有参数化类型的能力,可以定义使用泛型类型的类或方法,编译器会用具体的类型来替换泛型类型。

2.泛型主要优势是能够在编译时检测错误,而不是运行时。

3.泛型类或方法允许指定这个类或方法可以带有的对象类型,如果试图使用带有不兼容对象的类或方法,编译器会检测出这个错误。

4.定义在类、接口或者静态方法中的泛型称为形式泛型类型,随后可以用一个实际具体类型来替换它。替换泛型类型的过程称为泛型实例化。

5.使用原始类型是为了向后兼容java较早的版本,因为JDK1.5之前是没有泛型的。

6.使用类型消除的方法来实现泛型。编译器使用泛型类型信息来编译代码,但是随后消除它。因此,泛型信息在运行时是不可用的。这个方法能够使泛型代码向后兼容使用原始类型的遗留代码。

7.不能使用泛型类型参数创建实例。

8.不能使用泛型类型参数创建数组。

9.不能在静态环境中使用类的泛型参数。

10.在异常类中不能使用泛型类型参数。




如有错误,欢迎指正。




Centos7.6下安装Zabbix6 一、 阅读详情

相关推荐

基于Simulink的防空导弹六自由度弹道建模与仿真实战

本文详细介绍了基于Simulink的防空导弹六自由度弹道建模与仿真方法。通过分析导弹动力学原理、Simulink环境配置、气动力建模、推进与控制系统设计等关键环节,提供了一套完整的实战指南。文章特别强调了六自由度模型在防空导弹仿真中的重要性,并分享了常见问题排查与优化建议,为相关领域工程师提供实用参考。

apple5的专栏 868

Java 泛型

泛型是jdk5引入的类型机制,就是将类型参数化。泛型作为一种安全机制而产生泛型机制将类型转换时的类型检查从运行时提前到了编译时,使用泛型编写的代码比杂乱的使用object并在需要时再强制类型转换的机制具有更好的可读性和安全性。泛型在本质上是指类型参数化。所谓类型参数化,是指用来声明数据的类型本身,也是可以改变的,它由实际参数来决定。在一般情况下,实际参数决定了形式参数的值。而类型参数化,则是实际参数的类型决定了形式参数的类型。...

weixin_50518344的博客 350

安卓中蓝牙免提HFP的一些分析

最近看了一些大牛的博客,无不提到了技术分享的重要性,的确,分享自己的知识不仅仅是与他人讨论并相互提高的过程,更是对自己知识的梳理。希望自己能以此为契机,形成周期性博客分享的习惯。 文章标题为HFP的一些分析,HFP(Hand Free Profile)主要定义了安卓中与接打电话相关的一些功能的实现。本文主要介绍这其中对于HFP非常重要的Service Level Connection的建立。首先...

底层码农 772

泛型

泛型:jdk1.5版本之后出现的一种安全机制 泛型的好处? 1.将运行期的类型转换异常转移到了编译期 2.避免了强制转换的麻烦 泛型的用处?主要用在集合 什么是泛型?参数化类型,就是将具体的类型参数化 泛型擦除技术?是给编译期使用,用于编译期,确保了类型的安全运行。 运行的时候,.class文件中是没有泛型的,这个就是泛型擦除技术 为什么会有泛型擦除呢?为了兼容运行的类加载器 泛...

qq_40959562的博客 184

44、单级静态电流消耗最小化方法及功率优化比较器设计

本文探讨了单级静态电流消耗最小化方法及功率优化的多米诺逻辑比较器设计。通过分析类“AB”输入CMOS差分对电路,提出利用补偿电流源实现高低电流模式切换,提升运算放大器性能;结合VTCMOS与时钟门控技术,在90nm CMOS中设计低功耗比较器,并采用多米诺逻辑提高速度与能效。通过对比传统与改进型多米诺逻辑的静态功耗、动态功耗、延迟和PDP,验证了所提方案在高性能与低功耗方面的优势,适用于便携式设备等对能效要求严苛的应用场景。

pp12345的博客 121

基于 Simulink 的固态变压器(SST)多级协同控制实战教程

《固态变压器多级协同控制仿真指南》摘要: 本教程详细讲解了基于Simulink的固态变压器(SST)三级架构建模与控制方法。核心内容包含:1)搭建级联H桥整流(CHB)、双有源桥(DAB)和逆变器(VSI)的三级主电路;2)提出创新的多级协同控制策略,通过功率前馈实现输入输出级动态匹配;3)给出系统级功率平衡、单元级均压控制的具体实现方案。教程特别强调解决实际工程中的关键问题:代数环处理、软启动设计和刚性系统求解器选择,并提供了硬件在环(HIL)仿真建议。附带的MATLAB代码示例可直接用于实现电容电压均衡

xiaoheshang_123的博客 120

泛型的理解

一、泛型的作用 简单地说,泛型的作用是为了统一集合中存放的数据类型。 我们知道数组中可以存放任意数据类型,但存放的数据类型要一致,而集合中存储的数据类型可以不一致。也就是说,String类型和Integer类型的数据可以同时存放在一个集合中。 那么这样就很可能会出现问题,当某一个只打算存放String类型数据的集合中不小心混入一个Integer类型的数据,编译也不会进行报错。 因为集合本来就可以存放多种数据类型,但是程序员可能以为集合中存放的只有String类型的数据。 这个时候,就需要使用到泛型来规范集合

three_cats的博客 2122

渗透测试工具之Sliver

攻击者需要将生成的植入物传输到目标系统,并执行它。C2 框架的架构与 Metasploit(如 Meterpreter)类似,但更专注于。(Red Teaming)中常见的攻击工具之一,攻击者利用 C2 服务器。组成,二者共同实现 C2 服务器与受控设备的通信。植入物(Implants)是 Sliver 生成的。抓包分析时,可以看到所有数据都是加密传输的。和**监听器(Listeners)**功能。Sliver 支持多种通信协议,如。随着安全防御的不断提升,企业应加强。进行通信,数据仍然是加密的。

idlecloud0105的博客 1936

JAVA(泛型)知识总结

泛型 不使用泛型,使用集合时编程比较复杂 List list=new ArrayList(); list.add(123); //自动向上转型 int-->Integer-->Object //获取数据还需要窄化操作 int kk=(Integer)list.get(0); //不进行类型判断,有可能出现ClassCastException 使用泛型,可以将运行时的类型检查搬到编译期实现;同时获取数据时不需要再编码进行类型转换 List<Integer> list=ne

mhfaaa的博客 257

Pandas滚动窗口的妙用:动态计算列数据的最大值

Pandas的滚动窗口(rolling window)功能是数据分析中处理时间序列数据的重要工具。本文通过实例演示了如何使用rolling(window=4).max()计算DataFrame列A的滚动最大值,并将结果存入新列Max_Range。该方法会在4个元素的滑动窗口内计算最大值,前3行因数据不足显示为NaN。这种技术广泛应用于金融分析(如股价波动)、数据平滑和趋势识别等场景,能有效帮助分析数据的动态变化特征。示例展示了从数据准备到结果输出的完整流程,体现了Pandas在处理滑动窗口计算时的高效性和便

m0_74337424的博客 53

Fluent验证案例03:管道中湍流流动压降计算——采用kw-sst模型计算压降更为准确。

阅读(4053) 评论(0)本案例利用Fluent计算管道中湍流流动压降。

qq_15963745的博客 877

为什么说泛型是类型安全的

通常说泛型,比如List&lt;T&gt;是类型安全的,为什么这么说呢?   先来看一个类型不安全的例子。   class Program { static void Main(string[] args) { var tempArr = new ArrayList(); tempArr.Add...

weixin_34121304的博客 687

MacBook 长期挂机 OpenClaw:电池保护 + 防休眠设置

本文介绍了MacBook长期挂机运行OpenClaw时的电池保护和防休眠设置方案。主要内容包括:1)电池保护策略,通过电源连接、充电限制和定期充放电维护电池健康;2)防休眠设置,禁用系统休眠、自动休眠和屏幕休眠;3)OpenClaw的Docker部署方法。文章提供了详细的命令行脚本和配置说明,帮助用户实现MacBook的长期稳定运行,同时保护电池寿命。

一键难忘的博客 1695

浅析Java中的泛型

hello !大家好! 今天的主题就是:泛型。在使用集合类时,大家就已经接触到泛型了,那就是每个集合类后面的尖括号<>,这样一对尖括号,在java中就称为泛型。那么泛型这一个点,我们又该知道多少呢?我们往下看! 文章目录一、泛型的使用二、泛型类的定义-类型边界三、类型擦除四、泛型类的使用-通配符五、泛型方法六、泛型的限制 一、泛型的使用 前面我们学集合的时候,简单的说过泛型的使用。如下: ArrayList<Integer> list = new ArrayList<>(

x0919的博客 1505

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java泛型 包_Java泛型应用浅析

Java泛型应用浅析Java泛型,饿,这个东西吗,嚼一下还是有必要的。有啥用呢?小弟曾觉着吧,吹牛是条不错的出路,但没一次没有不吹破的。(绕吧^_^)详解呢,没啥必要了,参见附件解压后Java泛型详解.txt(引用网址…小弟知错了T^T)。一、泛型概念简述泛型吗,就是泛泛的类型,指代某一种类型的符号。例如Map,K、V指代某种类型一样。而我们呢,在内部则直接用K、V来进行处理。这样有啥好处呢?1....

weixin_39772388的博客 259

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java中关于泛型的浅析

前言 java 泛型是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像...

ostracod 350

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

浅析Java泛型

什么是泛型? 泛型是JDK 1.5的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数,在用到的时候在指定具体的类型。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。 基本术语介绍 以ArrayList<E>和ArrayList<Integer>为例 整个ArrayLi...

weixin_30426065的博客 184

浅析java泛型编程

什么是泛型? 泛型主要是 Java SE 1.5 的新特性,泛型的本质就是参数化类型,什么是参数化类型呢?就是所操作的数据类型被指定为一个参数,这种参数可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 在编译阶段,识别的是<T>,在运行期识别的是Object类 泛型的意义? a.可以对类型进行自动检查 注:不是替换 仅仅是用来进行类型安全检查!! b.自动...

简之易安的博客 817

Java泛型原理浅析

Java泛型浅析一、泛型定义二、泛型意义三、泛型实现四、泛型边界与通配符五、泛型动态类型安全六、泛型反射七、ResolvableType 一、泛型定义 泛型,即参数化类型,类似于函数的形参,在使用的时候可以传入具体的类型,泛型仅应用于类型之上,可以使代码应用于多种类型,使类和方法具有更广泛的表达能力。 二、泛型意义 为了使代码具有更广泛的灵活性,一般会采取以下几种方式编程: 1.重载方法,此编程方式可以增加程序的灵活性和适用性,但是编写繁琐 2.方法参数为基类,方法可以接受从这个基类导出的任何类作为参数,可

piaoyu250的博客 525

JAVA泛型浅析

Java范型generics,是JDK1.5引入的新特性,是一种编译时类型安全检测机制,可以在编译时检测到非法的类型。定义泛型参数时还可以使用继承,例如 ,后面都可以使用User类或它的子类接收在必要的时再强转指定类型。在方法调用时检测类型,在返回值类型之前的是范型方法的象征,此处表示声明了一个范型T,范型数量也可以多个比如;当实现范型接口的类不传范型实参:比如下面的也需要在类名增加GenericInterUser1和接口一样的范型。

Hidanchaofan的博客 680

Java泛型浅析一二

泛型是一种参数化类型的机制。它可以使得代码适用于各种类型,从而编写更加通用的代码,例如集合框架。 泛型是一种编译时类型确认机制。它提供了编译期的类型安全,确保在泛型类型(通常为泛型集合)上只能使用正确类型的对象,避免了在运行时异常。

EndlessProcess的专栏 724

浅析 Java 泛型

前言 在JDK1.5之后出现了泛型这个概念,在介绍泛型之前,不妨想想为什么会有泛型这个东西? 例如在泛型出现之前,使用List是这样的 List list = new ArrayList(); 我可以往这个list中放任何类型的东西,多方便!你是方便了,但是开发者就难受了,对每个元素都要记得转换类型,不然哪里知道这里面放的什么鬼东西,如果限定某个List只能放某种类型不就好了嘛 所以Java参考了C++模板类的概念,定义一个模板类 public class ArrayList<T> imple

阳光大男孩!!!的博客 682

浅析Java-泛型

目录 概念 特点 优势 使用 泛型特性-擦除 泛型标识符 使用泛型的三种方式 通配符 参考文献 注:如有错误,欢迎指出~3Q~ 概念 泛型:本质是参数化类型,Java SE1.5新增的特性。 特点 类型参数只能用来表示引用类型。对于基本数据类型,提供了自动装箱机制,从而可以使用对应的包装类型作为泛型化参数传入。泛型可以用在接口、方法和类上,分别称作泛型接口、泛型方法和泛...

星陨LHF的博客 169

java泛型 简书_浅析~Java泛型

1、Java中的泛型思维导图Java泛型.jpg1.1、为什么要使用泛型例如下面这个例子,如果list不加泛型,先向其添加两个String的值,再向其中添加一个Integer的值,这是完全可以的,因为这是list默认的类型是Object的;但是平时开发当中,可能忘了还传入了一个Integer的类型,就会导致如下的错误:public static void main(String[] args) {...

weixin_39530839的博客 159
上一篇: 导入项目后,http://schemas.android.com/apk/res/android报错
下一篇: python pip list
普通网友
博客等级 码龄10年 24粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值