JAVA泛型简析

泛型是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); 
 } 
}

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

相关推荐

Cheat Engine实战:多级指针逆向破解游戏内存的5个关键步骤(附C++模拟代码)

本文详细解析了使用Cheat Engine进行多级指针逆向破解游戏内存的完整流程。通过5个关键步骤,从定位动态地址到逐层追踪指针链,最终构建稳定指针路径。文章结合C++模拟代码,深入剖析了指针链的底层汇编原理,并提供了高级排查技巧,帮助读者掌握逆向工程中的核心内存追踪技术。

weixin_29239279的博客 307

Java泛型编程快速入门

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

银狐的专栏 1032

第 4 课 树莓派5的换源与中文输入法

树莓派换源、中文输入法的安装

嵌入式老牛的博客 2291

Java泛型快速教程

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

最佳 Java 编程 433

获取B站某用户更多的关注数和粉丝数

获取B站某用户更多的关注数和粉丝数 相关记录 一、 前言 B 站最多只能翻 5 页用户的关注数和粉丝数,如何能够看到更多呢。 方法我也是从网上翻来的,记载博客里,算是我研究过这个话题了。 二、需要的东西 关注数的 api https://api.bilibili.com/x/relation/followings?vmid=2884629&pn=1&ps=20&order=desc&jsonp=jsonp 关注者(粉丝)的 api https://api.bilibili.

Enderman_xiaohei的博客 4825

nvlddmkm事件ID14报错排查全指南:从找不到描述到显卡驱动崩溃

系统日志中的“无法找到描述”往往让人一头雾水,但这类提示其实隐藏着驱动故障的关键线索。Windows事件查看器通过事件源和ID记录系统异常,其中显卡驱动相关的内核模式驱动组件一旦超时失败,就会触发TDR机制,产生13、14、153等不同事件ID。理解这些ID的含义,比纠结“找不到描述”本身更重要。对于频繁出现的驱动崩溃问题,可以从日志频率和发生场景判断方向,再通过安全模式下彻底清理驱动、关闭冲突软件、检查供电和温度等步骤逐层定位。无论是游戏满载黑屏,还是睡眠唤醒后闪退,掌握NVIDIA驱动日志的解读逻辑,都

weixin_30545945的博客 419

Java高级编程——泛型

Java高级编程——泛型

qq_61524266的博客 988

AS5600磁编码器选型与安装避坑指南:磁铁形状、间隙距离到底怎么选?(附实测数据)

本文详细解析了AS5600磁编码器的选型与安装要点,包括磁铁形状、间隙距离等关键参数的选择,并附有实测数据支持。特别针对Arduino和I2C接口的应用场景,提供了硬件选型和机械安装的实用指南,帮助开发者避免常见陷阱,提升系统精度和稳定性。

weixin_27038245的博客 290

Java中的泛型编程

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

陈九龙的专栏 621

EEG信号分析实战:从时域到频域,手把手教你用Python处理脑电数据

本文详细介绍了使用Python进行EEG信号分析的实战方法,涵盖时域分析、频域分析和时频分析三大核心技术。通过MNE-Python等工具,读者将学习如何从原始脑电数据中提取事件相关电位(ERP),解码脑波节律特征,并运用时频分析追踪动态神经活动。教程包含完整的代码示例和认知科学解释,适合神经科学研究者快速掌握EEG分析全流程。

pink的博客 1009

最新Python爬虫实战(入门爬虫篇)——案例13:某乎热榜数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

本次案例通过Python爬虫技术,成功实现了基于Cookies认证的某乎热榜数据爬取与Excel保存。代码采用模块化设计,包含Cookies解析、HTML请求、结构化解析、Excel持久化等完整流程;通过配置浏览器请求头+Cookies认证,有效突破某乎基础反爬策略,保证请求稳定性。整个爬虫逻辑遵循“Cookies认证 → 页面请求 → HTML解析 → 数据清洗 → 保存到Excel”的标准流程,与需要会话验证的网站爬取范式高度一致。Cookies解析与认证。

努力让自己发光,对的人才能迎着光而来 33万+

Java泛型编程

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

isuss的博客 406

AMBA-CHI协议详解(七)

本节描述该协议包含的支持系统保序需求的机制。

Crazzy_M的博客 1161

Java泛型原理简析

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

qq_42893430的博客 245

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java泛型-Type简析

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

记录点滴 607

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java之泛型

一、什么是泛型 1.背景: JAVA推出泛型以前,程序员可以构建一个元素类型为Object的集合,该集合能够存储任意的数据类型对象,而在使用该集合的过程中,需要程序员明确知道存储每个元素的数据类型,否则很容易引发ClassCastException异常。 2.概念: Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全监测机制,该机制允许我们在编译时检测到非法的类型数据结构。泛型的本质就是参数化类型,也就是所操作的数据类型被指定为一个参数。 3.好处: 类型安全 消

Beyondczn的博客 9375

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

jijiangpeng的博客 7471
上一篇: Android中Context
下一篇: Android延时执行的几种方法
whatsyourname
博客等级 码龄23年 13粉丝 326原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值