JAVA泛型简析

【泛型】Java中的泛型,泛型类,泛型接口,泛型方法,泛型擦除 这篇文章总结一下Java中的泛型相关知识点,包括:泛型概念、泛型优缺点、泛型通配符、泛型上下界、泛型使用(泛型类、泛型接口、泛型方法)、泛型擦除等内容。 一、泛型概念 (1)什么是泛型 什么是泛型??? 泛型(Generic),是一种参数化数据类型,它允许我们在编写程序代码的时候不用具体指定需要什么数据类型,而是等到具体使用的时候,将数据类型以参数的形式传递给程序,这就是泛型程序设计。 (2)为什么需要泛型 我们来看看下面这个栗子 假设现在有个需求,通过集合保存元素,需要保存String字 阅读详情

泛型是JDK1.5支持的新功能之一,在目前的JAVA编程中被广泛的使用,下面我们就来看看泛型和它的属性。

1、Java泛型 

  其实Java的泛型就是创建一个用类型作为参数的类。就象我们写类的方法一样,方法是这样的method(String str1,String str2 ),方法中参数str1、str2的值是可变的。而泛型也是一样的,这样写class Java_Generics<K,V>,这里边的K和V就象方法中的参数str1和str2,也是可变。下面看看例子: 

//code list 1 
import Java.util.Hashtable; 
class TestGen0<K,V>{ 
 public Hashtable<K,V> h=new Hashtable<K,V>(); 
 public void put(K k, V v) { 
  h.put(k,v); 
 } 
 public V get(K k) { 
  return h.get(k); 
 } 
 public static void main(String args[]){ 
  TestGen0<String,String> t=new TestGen0<String,String>(); 
  t.put("key", "value"); 
  String s=t.get("key"); 
  System.out.println(s); 
 } 
} 

  正确输出:value 

  这只是个例子(Java中集合框架都泛型化了,这里费了2遍事.),不过看看是不是创建一个用类型作为参数的类,参数是K,V,传入的“值”是String类型。这个类他没有特定的待处理型别,以前我们定义好了一个类,在输入输入参数有所固定,是什么型别的有要求,但是现在编写程序,完全可以不制定参数的类型,具体用的时候来确定,增加了程序的通用性,像是一个模板。

  呵呵,类似C++的模板(类似)。 

  1.1. 泛型通配符 

  下面我们先看看这些程序: 

//Code list 2 
void TestGen0Medthod1(List l) { 
 for (Object o : l) 
  System.out.println(o); 
} 

  看看这个方法有没有异议,这个方法会通过编译的,假如你传入String,就是这样List<String>。

  接着我们调用它,问题就出现了,我们将一个List<String>当作List传给了方法,JVM会给我们一个警告,说这个破坏了类型安全,因为从List中返回的都是Object类型的,而让我们再看看下面的方法。 

//Code list 3 
void TestGen0Medthod1(List<String> l) { 
 for (Object o : l) 
  System.out.println(o); 
} 

  因为这里的List<String>不是List<Object>的子类,不是String与Object的关系,就是说List<String>不隶属于list<Object>,他们不是继承关系,所以是不行的,这里的extends是表示限制的。 

  类型通配符是很神奇的,List<?>这个你能为他做什么呢?怎么都是“?”,它似乎不确定,他总不能返回一个?作为类型的数据吧,是啊他是不会返回一个“?”来问程序员的?JVM会做简单的思考的,看看代码吧,更直观些。 

//code list 4 
List<String> l1 = new ArrayList<String>(); 
li.add(“String”); 
List<?> l2 = l1; 
System.out.println(l1.get(0)); 

  这段代码没问题的,l1.get(0)将返回一个Object。 

  1.2. 编写泛型类要注意: 

  1) 在定义一个泛型类的时候,在 “<>”之间定义形式类型参数,例如:“class TestGen<K,V>”,其中“K” , “V”不代表值,而是表示类型。 

  2) 实例化泛型对象的时候,一定要在类名后面指定类型参数的值(类型),一共要有两次书写。例如:

TestGen<String,String> t=new TestGen<String,String>(); 

  3) 泛型中<K extends Object>,extends并不代表继承,它是类型范围限制。 

2、泛型与数据类型转换 

  2.1. 消除类型转换 

  上面的例子大家看到什么了,数据类型转换的代码不见了。在以前我们经常要书写以下代码,如: 

//code list 5 
import Java.util.Hashtable; 
class Test { 
 public static void main(String[] args) { 
  Hashtable h = new Hashtable(); 
  h.put("key", "value"); 
  String s = (String)h.get("key"); 
  System.out.println(s); 
 } 
} 

  这个我们做了类型转换,是不是感觉很烦的,并且强制类型转换会带来潜在的危险,系统可能会抛一个ClassCastException异常信息。在JDK5.0中我们完全可以这么做,如: 

//code list 6 
import Java.util.Hashtable; 
class Test { 
 public static void main(String[] args) { 
  Hashtable<String,Integer> h = new Hashtable<String,Integer> (); 
  h.put("key", new Integer(123)); 
  int s = h.get("key").intValue(); 
  System.out.println(s); 
 } 
} 

  这里我们使用泛化版本的HashMap,这样就不用我们来编写类型转换的代码了,类型转换的过程交给编译器来处理,是不是很方便,而且很安全。上面是String映射到String,也可以将Integer映射为String,只要写成HashTable<Integer,String> h=new HashTable<Integer,String>();h.get(new Integer(0))返回value。果然很方便。 

  2.2 自动解包装与自动包装的功能 

  从上面有没有看到有点别扭啊,h.get(new Integer(123))这里的new Integer(123);好烦的,在JDK5.0之前我们只能忍着了,现在这种问题已经解决了,请看下面这个方法。我们传入一个int这一基本型别,然后再将i的值直接添加到List中,其实List是不能储存基本型别的,List中应该存储对象,这里编译器将int包装成Integer,然后添加到List中去。接着我们用List.get(0);来检索数据,并返回对象再将对象解包装成int。恩,JDK5.0给我们带来更多方便与安全。 

//Code list 7 
public void autoBoxingUnboxing(int i) { 
 ArrayList<Integer> L= new ArrayList<Integer>(); 
 L.add(i); 
 int a = L.get(0); 
 System.out.println("The value of i is " + a); 
} 

  2.3 限制泛型中类型参数的范围 

  也许你已经发现在code list 1中的TestGen<K,V>这个泛型类,其中K,V可以是任意的型别。也许你有时候呢想限定一下K和V当然范围,怎么做呢?看看如下的代码: 

//Code list 8 
class TestGen2<K extents String,V extends Number> 
{ 
 private V v=null; 
 private K k=null; 
 public void setV(V v){ 
  this.v=v; 
 } 
 public V getV(){ 
  return this.v; 
 } 
 public void setK(K k){ 
  this.k=k; 
 } 
 public V getK(){ 
  return this.k; 
 } 
 public static void main(String[] args) 
 { 
  TestGen2<String,Integer> t2=new TestGen2<String,Integer>(); 
  t2.setK(new String("String")); 
  t2.setV(new Integer(123)); 
  System.out.println(t2.getK()); 
  System.out.println(t2.getV()); 
 } 
} 

  上边K的范围是<=String ,V的范围是<=Number,注意是“<=”,对于K可以是String的,V当然也可以是Number,也可以是Integer,Float,Double,Byte等。看看下图也许能直观些请看上图A是上图类中的基类,A1,A2分别是A的子类,A2有2个子类分别是A2_1,A2_2。 

  然后我们定义一个受限的泛型类class MyGen<E extends A2>,这个泛型的范围就是上图中兰色部分。 

  这个是单一的限制,你也可以对型别多重限制,如下: 

class C<T extends Comparable<? super T> & Serializable> 

  我们来分析以下这句,T extends Comparable这个是对上限的限制,Comparable< super T>这个是下限的限制,Serializable是第2个上限。一个指定的类型参数可以具有一个或多个上限。具有多重限制的类型参数可以用于访问它的每个限制的方法和域。 

  2.4. 多态方法 

//Code list 9 
class TestGen { 
 <T extends Object> public static List<T> make(T first) { 
  return new List<T>(first); 
 } 
}

GoPro官方API实战:从蓝牙配对到Wi-Fi流媒体,构建跨平台控制应用 本文详细解析了GoPro官方API的开发实践,涵盖蓝牙配对、Wi-Fi流媒体控制等关键技术。通过实战案例,指导开发者如何构建跨平台控制应用,解决设备发现、指令解析、视频流传输等核心问题,并分享Android平台迁移经验与常见问题排查方法。 阅读详情

相关推荐

4. PCIe 接口时序

在上一篇中,大致介绍IPcore接口。总的来说接口如下图数据的接收和发送通过transmitTLPinterface和ReceiveTLPinterface。收发数据的时序也只是描述这几个接口的关系。从手册上截取PCIex1的接口时序。

jjinl的专栏 6123

Java泛型编程快速入门

 JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0。这说明Java已经有大幅度的变化。本文将讲解JDK5.0支持的新功能-----java的泛型.   1、java泛型   其实java的泛型就是创建一个用类型作为参数的类。就象我们写类的方法一样,方法是这样的method(String str1,String str2 ),方法中参数str1、str2的值是可变的。而泛型也是一

银狐的专栏 1032

2.13寸电子墨水屏HINK-E0213+esp8266

很久以前买的一块电子墨水屏,运气很好,这个型号HINK-E0213资料很全,而且微雪官网也有相关电路资料等。

梦境虽美,却不长. 3004

Java泛型快速教程

泛型是Java SE 5.0引入的一种Java功能,在其发布几年后,我发誓那里的每个Java程序员不仅听说过它,而且已经使用过它。 关于Java泛型,有很多免费和商业资源,而我使用的最佳资源是: Java教程 Java泛型和集合 ,作者Maurice Naftalin和Philip Wadler 有效的Java(第二版) ,由Joshua Bloch撰写。 尽管有大量的...

最佳 Java 编程 433

Matlab实战:水声信号DEMON谱分析从入门到精通(附完整源码)

本文详细介绍了使用Matlab进行水声信号DEMON谱分析的完整流程,从基础理论到实战应用,涵盖信号预处理、包络提取、频谱分析等关键步骤,并附完整源码。特别针对水声通信中的低信噪比环境,提供了多种优化方案和性能提升技巧,帮助读者快速掌握这一水下目标检测的核心技术。

gamma的博客 296

Ubuntu 上 1Panel 的安装与高效运维实践

本文详细介绍了在Ubuntu系统上安装和高效运维1Panel面板的完整实践指南。内容涵盖了一键安装、Docker容器可视化部署、计划任务自动化以及网站数据库管理等核心功能,并提供了安全加固、资源监控与数据备份等进阶技巧,旨在帮助用户快速搭建并管理一个强大易用的服务器环境。

weixin_29210759的博客 144

Java高级编程——泛型

Java高级编程——泛型

qq_61524266的博客 988

Stable Diffusion 模型分享:Indigo Furry mix(人类与野兽的混合)

Indigo Furry mix 是一个混合模型,出的图具有雄性人类的体型和野兽的形态。条目内容类型大模型基础模型SD 1.5来源CIVITAI作者indigowing文件名称文件大小1.99GB。

水滴的博客 1830

Java中的泛型编程

引言 什么是泛型? 泛型的意思是 类型参数化。 到底什么是类型参数化呢?通过这一节内容,我们希望大家能够彻底弄懂什么是泛型,以及如何在开发中使用泛型。 Java泛型应用是java核心基础之一,从java5开始引入泛型概念。如果你曾经使用过java中的collection相关的类,那么就算你已经接触过泛型了。在java的Collection中使用泛型是一件很简单的事情,可泛型还具有许...

陈九龙的专栏 621

芒果YOLO11改进172:ARConv自适应旋转卷积,全网首发 | 即插即用:以增强其表征能力,从而准确检测方向物体,ICCV顶会论文idea

ARConv自适应旋转卷积,全网首发 | 即插即用:以增强其表征能力,从而准确检测方向物体,ICCV顶会论文idea

包括YOLOv5、YOLOv7、YOLOv8等模型改进 1515

Coze 上 OpenClaw 完整使用攻略(零代码 + 24 小时在线 + 飞书 / 微信接入)

Coze(扣子)是目前国内零门槛部署 OpenClaw 最友好的平台,无需服务器、不用命令行,5 分钟即可拥有可执行本地 / 云端任务的 AI 助手,还能一键发布到飞书、微信、钉钉等 IM。

hy行者勇哥的博客 2923

Java泛型编程

泛型是Java中的一种特性,它允许我们定义一种类型,在使用时再指定具体的类型。例如,我们可以定义一个 List 类型,然后在使用时指定具体的元素类型,例如 List<String>、List<Integer> 等。Java中的泛型是通过参数化类型来实现的,我们可以在定义类、接口、方法时,使用参数来表示类型变量,并在使用时指定具体的类型。在上述代码中,我们定义了一个 Box 类,它使用类型变量 T 表示要存储的值的类型。");

isuss的博客 406

使用 MATLAB/Simulink 构建一个基于FOC控制的PMSM矢量控制仿真模型

本教程详细介绍了基于MATLAB/Simulink的永磁同步电机(PMSM)磁场定向控制(FOC)系统建模与仿真方法。主要内容包括:PMSM电机模型参数设置、Clarke/Park变换模块设计、电流环PID控制器配置、SVPWM调制实现以及系统仿真参数优化。文章提供了模块化设计思路和具体参数设置示例,并给出了PID整定建议和进阶优化方向。通过该仿真模型,可深入理解PMSM矢量控制原理,掌握高性能电机控制系统的建模技巧,适用于伺服系统、电动汽车驱动等高端控制场景。教程还推荐了实时仿真和高级控制策略等扩展应用。

xiaoheshang_123的博客 529

Java泛型原理简析

Java泛型被许多人称作一颗语法糖(添加某种语法,以增加程序的易读易写性),是因为它C#相比只能算是“伪泛型”。为什么这么说呢?泛型到底是什么呢? 写程序的时候经常会用到数组,可以用数组来存放一个数据集合。如果让你数组存三个数——1,2,3,相信你很快就能写出代码: int[] arry = new int[3]; arry[0] = 1; arry[1] ...

qq_42893430的博客 245

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java泛型-Type简析

目录1.简介2.细节分析2.1 如何获取一个filed的泛型类型?2.2 如何获取一个方法的参数的泛型类型? 1.简介 Type接口的出现是为了解决Java泛型擦除导致的无法获取泛型信息的问题,通过 getGenericInterfaces,getGenericType和getGenericParameterTypes等方法来获取泛型信息,type的直接子类和间接子类主要有以下五种: 名称 描述 Class 常用的class类,不包含泛型信息,又称为raw type,如 Integer.cl

记录点滴 607

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

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

Java泛型详解:Java泛型集合、泛型类、泛型方法、泛型的使用

在 Java 1.5 之前没有泛型,通常需要使用强制类型转换的方式将一种数据类型转换为另一种数据类型,这种转换要求开发者对实际参数的类型具有可预知性。对于强制类型转换错误的情况,编译器可能不会提示错误,但是在运行时会出现异常,这是一个安全隐患。 为了解决这一隐患,从 Java 1.5 开始提供了泛型。泛型可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。本节将详...

jijiangpeng的博客 7444

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java泛型——为何要有泛型

对于String类类型来说,它是继承自Object的,而Integer的直接父类是Number,因此会有Integer无法转String的错误。泛型类是在实例化类的时候指明泛型的具体类型,那么泛型方法就是在调用方法时指明泛型的具体类型。在实现传入泛型实参的泛型接口的实现类定义中,实现类即使不声明泛型,也不会编译错误。在实现未传入泛型实参的泛型接口的实现类定义中,实现类要声明泛型,否则会编译错误。为了避免这样可能的错误,引入泛型,使编译器在编译阶段就提示不匹配的类类型。方法返回了一个更加特定的返回类型。

xiaovie的博客 1732

【 java 泛型】详解java泛型

java泛型可以提高java程序的类型安全,提高程序的可靠性,并且在开发中也较常用,因此还是要简单学习一下!

阿牛的博客 2069
上一篇: 判断发送短信后的状态……BroadcastReceiver聆听PendingIntent
下一篇: Android中的Context详解
mywebstudy
博客等级 码龄15年 30粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值