`
fehly
  • 浏览: 248431 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

泛 型

    博客分类:
  • java
阅读更多

什么是泛型

  • 泛型(Gernerics)机制自java se5.0开始引入,其实质是将原本确定不变的数据类型参数化。
  • 泛型好处:作为对原有java类型体系的扩充,使用泛型可以提高java应用程序的类型安全,可维护性和可靠性.
  • 都用于集合框架中的数据造型问题.

集合框架中的泛型

用法:

创建集合容器时规定其允许保存的元素类型,然后由编译器负责添加元素的类型合法性检查,在取用集合元素时则不必再进行造型处理.

使用泛型的列表集合

import java.util.Vector;
import java.util.Date;

public class TestVector{
	public static void main(String args[]){
		Vector<String> v = new Vector<String>();
		v.addElement("Tom");	
		v.addElement("Billy");	
		v.addElement("Nancy");	
		v.addElement(new Date());		
		v.addElement(new Integer(300));	

		for(int i=0;i<v.size();i++){
			String name = v.elementAt(i);
			System.out.println(name);	
		}
	}	
}

 在Hashtable中使用泛型

public class Employee{
	private final int id;
	private String name;
	private double salary;
	
	public Employee(int id,String name,double salary){
		this.id = id;
		this.name = name;
		this.salary = salary;	
	}
	public int getId(){
		return id;	
	}
	public String geName(){
		return name;	
	}
	public void setName(String name){
		this.name = name;
	}
	public double getSalary(){
		return salary;	
	}
	public void setSalary(double salary){
		this.salary = salary;	
	}
	public void showInfo(){
		System.out.println(id + "\t" + name + "\t" + salary);	
	}
}
import java.util.Hashtable;

public class TestHashtable{
	public static void main(String args[]){
		Hashtable<Integer,Employee> ht = new Hashtable<Integer,Employee>();
		ht.put(101,new Employee(101,"张三",5000));
		ht.put(102,new Employee(102,"李四",4800));
		ht.put(106,new Employee(106,"赵六",8620));
		
		Employee e = ht.get(102);
		e.showInfo();
	}	
}

 泛型的向后兼容性

java语言中的泛型向过去兼容

在高版本开发环境中编译未启用泛型机制的集合框架应用代码时,会输出类似于如下形式的编译提示信息:

注意:C:\text\test.java 使用了未经检查或不安全的操作
注意:要了解详细信息,请使用-Xlint:unchecked重新编译

可以使用SuppressWarnings注解,关闭编译提示或警告信息

关闭编译提示

import java.util.Date;
import java.util.Vector;
import java.lang.SuppressWarnings;  

@SuppressWarnings({"unchecked"})
public class TestSuppressWarnings{
	public static void main(String args[]){
		Vector v = new Vector();
		v.addElement("Tom");	
		v.addElement("Billy");	
		v.addElement("Nancy");	
		v.addElement(new Date());		
		v.addElement(new Integer(300));	

		for(int i=0;i<v.size();i++){
			Object o = v.elementAt(i);
			System.out.println(o);	
		}
	}	
}

泛型类:

  •  由类型参数修饰的类型称为泛型类
  • 格式:数据类型<类型参数>

泛型类举例:

public class vector<E>{
       public void addElement(E obj){---}
       public E elementAt(int index){---}
}

 使用泛型类时,应明确指定类型参数

Vector<String> v=new Vector<String>();

public class Person<T>{
	private final int id;
	private T secrecy;
	public Person(int id){
		this.id = id;	
	}
	public int getId(){
		return id;	
	}
	public void setSsecrecy(T secrecy){
		this.secrecy = secrecy;	
	}
	public  T getSecrecy(){
		return secrecy;	
	}
}
public class Test{
	public static void main(String[] args){
		Person<String> p1 = new Person<String>(101);
		p1.setSsecrecy("芝麻开门");		
		String s = p1.getSecrecy();
		System.out.println(p1.getId() + "\t密码是:" + s);
		
		Person<Double> p2 = new Person<Double>(102);
		p2.setSsecrecy(8700.45);
		double money = p2.getSecrecy();
		System.out.println(p2.getId() + "\t秘密资金数额:" + money);
	}
}

同一个泛型类搭配不同的类型参数复合而成的类型属于同一个类,但却是不同的类型例如:

Vector<String>与Vector<Double>

 

同一个泛型类与不同的额类型参数复合而成的类型间并不存在继承关系,即使是类型参数间存在继承关系时也是如此例如

Vector<String>与Vector<Object>

类型通配符"?"

  • 使用"?"作为类型参数,例如Vector<?>:
  • Vector<?>是任何泛型Vector的父类型
  • Vector<?>类型的变量在调用方法时时受到限制的——凡是必须知道具体类型参数才能进行的操作均被禁止.
import java.util.Vector;
public class Test{
	public static void main(String[] args){
		Test t = new Test();		
		Vector<String> vs = new Vector<String>();
		vs.add("Tom");		
		vs.add("Billy");		
		vs.add("Kessey");		
		t.overview(vs);	
		
		Vector<Integer> vi = new Vector<Integer>();
		vi.add(300);
		vi.add(500);
		t.overview(vi);
	}
	
	public void overview(Vector<?> v){
		for(Object o:v){
			System.out.println(o);	
		}	
	}
}

 使用泛型方法

import java.util.Vector;
public class Test{
	public static void main(String[] args){
		Test t = new Test();		
		String valid = t.evaluate("tiger","tiger");
		Integer i = t.evaluate(new Integer(300),new Integer(350));
		System.out.println(valid);
		System.out.println(i);
	}
	
	public <T> T evaluate(T a,T b){
		if(a.equals(b))
			return a;
		else
			return null;	
	}
}

 受限制的类型参数

泛型机制允许开发者对类型参数进行附加约束.

import java.lang.Number;
public class Point<T extends Number>{
	private T x;
	private T y;
	public Point(){
	}
	public Point(T x, T y){
		this.x = x;
		this.y = y;	
	}
	public T getX(){
		return x;	
	}
	public T getY(){
		return y;	
	}
	public void setX(T x){
		this.x = x;	
	}
	public void setY(T y){
		this.y = y;	
	}
	public void showInfo(){
		System.out.println("x=" + x + ",y=" + y);	
	}
}
public class Test{
	public static void main(String[] args){
		Point<Integer> pi = new Point<Integer>(20,40);
		pi.setX(pi.getX() + 100);
		pi.showInfo();
		
		Point<Double> pd = new Point<Double>();
		pd.setX(3.45);
		pd.setY(6.78);
		pd.showInfo();
				
		Point<String> ps = new Point<String>();		
	}
}

 受限制的类型通配符

import java.util.Vector;
public class Test{
	public static void main(String[] args){
		Test t = new Test();
		Vector<Integer> vi = new Vector<Integer>();	
		vi.add(300);	
		vi.add(500);
		t.show(vi);
		
		Vector<Double> vd = new Vector<Double>();
		vd.add(3.14);
		vd.add(5.78);
 		t.show(vd);
 		
 		Vector<String> vs = new Vector<String>();
 		vs.add("Tom");
 		vs.add("Billy");
 		//t.show(vs);
 		
 		Vector<? extends Number> va ;
 		va = vi;
 		va = vd; 
 		//va = vs;
	}
	
	public void show(Vector<? extends Number> v){
			System.out.println(v);
	}
}

 

分享到:
评论
3 楼 mefly 2010-12-31  
我又想了下,可能是? extends Number 用在外部调用和使用时,T extends Number是在泛型类的内部定义用的。
2 楼 fehly 2010-12-29  
mefly 写道
想问一下,最后一个例子中的? 号 为什么不能替换成T 呢
? extends Number 和 T extends Number 有什么区别?

Hi,mefly:
个人认为边界泛型,
   ? extends Number (1)
   T extends Number (2)
都差不多  1.中的? 指的是Number的子类或者Number类型
          2.中的T 也值的Number的子类或者Number类型
   但 ?这种写法有点冷.
   如果非要说区别的可能是这样的-->
   eg.T类型在保存的时候 save(T t)
                       save(? t) //error
      T可以是一个确定的类型
      ?是一个不确定的
   以上eg纯属猜测....
呵呵当然,这个只是我的理解而已,可能也不是很正确
  
                                      from:fehly
1 楼 mefly 2010-12-29  
想问一下,最后一个例子中的? 号 为什么不能替换成T 呢
? extends Number 和 T extends Number 有什么区别?

相关推荐

    泛 型 全 面 总 结

    泛型是Java编程中一个强大的特性,自JDK 1.5版本引入,旨在提高代码的安全性和效率。泛型的主要目的是在编译期间检查类型安全,并允许编译器生成更高效的字节码。它允许我们在定义集合、类、接口和方法时指定一种或...

    泛用型贴标机.rar

    《泛用型贴标机详解》 在工业自动化领域,贴标机是不可或缺的重要设备,其主要用于产品包装上的标签粘贴工作,提高了生产效率并确保了标签的质量。本篇文章将详细解析“泛用型贴标机”,并结合提供的“泛用型贴标机...

    泛用型贴标机全套图纸-几何模型

    【标题】"泛用型贴标机全套图纸-几何模型"揭示了这是一份关于通用贴标设备的设计图纸集,其中包含的是三维几何模型。在机械工程和自动化领域,这样的图纸是设计、制造和组装机械设备的基础,特别是对于贴标机这种...

    集团型多元化企业的数字化转型实践-泛地产行业大会员忠诚度解决方案-分享材料.pdf

    集团型多元化企业的数字化转型实践-泛地产行业大会员忠诚度解决方案

    带状疱疹及带状疱疹后神经痛.ppt

    特殊类型的带状疱疹包括眼带状疱疹和耳带状疱疹,以及各种不典型的类型,如顿挫型、不全型、大疱型、出血型、坏疽型、泛发型和播散型等。 神经系统并发症可能包括急性或慢性脑炎、脊髓炎、无菌性脑膜炎、多神经根炎...

    带状疱疹及带状疱疹后神经痛.ppt.ppt

    不同类型的特殊表现包括眼带状疱疹、耳带状疱疹和其他不典型的类型,如顿挫型、不全型、大疱型、出血型、坏疽型、泛发型、播散型等。带状疱疹还可能引发神经系统和内脏的并发症,如急性或慢性脑炎、脊髓炎、多神经根...

    儿童白癜风112例临床流行病学分析.docx

    在临床特征上,非节段性型白癜风是最常见的类型,占75.0%,其中肢端型占39.29%,泛发型占22.62%,散发型占38.10%。节段性型则占25.0%。发病部位以头、面、颈为主,这些部位分别占17.86%、16.07%和15.18%。此外,约...

    刚毛柽柳RING型E3泛素连接酶基因的克隆及表达分析

    刚毛柽柳RING型E3泛素连接酶基因的克隆及表达分析 ,张玉,张悦,E3泛素刚毛柽柳RING型E3泛素连接酶基因的克隆及表达分析连接酶是一个种类复杂的蛋白质家族,在对植物逆境胁迫的响应和生长发育等方�

    行业文档-设计装置-一种节能型泛光灯.zip

    在当前的环保与能源效率议题日益受到关注的背景下,"行业文档-设计装置-一种节能型泛光灯.zip" 提供了一个重要的知识焦点,即如何通过创新设计实现照明设备的节能化。这份压缩包内包含的"一种节能型泛光灯.pdf"详细...

    B25 泛用型贴标机.rar

    【标题】"B25 泛用型贴标机"所指的是一款设计用于各种不同形状和尺寸的产品贴标的机械设备。这种设备通常被广泛应用于食品、药品、化妆品、电子等行业,能够实现自动化、高效率的标签粘贴,提高生产线的生产速度和...

    C#和Labview资料

    ¨ … …… … … …1275.4.1 协变和抗变……………… 1285.4.2 泛型接口的协变………… 1295.4.3 泛型接口的抗变 ………… 1305.5 泛 型 结 构 ¨ … … … … … ¨ … ¨1315,6 泛 型方 法 … … … … …… … ...

    大数据-算法-122型异蕴涵泛三I算法及其应用研究.pdf

    《大数据-算法-122型异蕴涵泛三I算法及其应用研究》这篇博士论文主要探讨了在大数据处理和算法领域中,一种名为122型异蕴涵泛三I(Generalized Triple-I)算法的理论与应用。这篇论文由唐一鸣撰写,由刘晓平教授指导...

    泛目录5天上爱站权重7的源码思路解析

    最新新闻蜘蛛池站群源码-泛目录5天爱站权重7零距离泛目录:目前看到市面上权重最快的泛目录程序,程序目录结构见下面的图,程序来看有一些龙少站群的影子(泛域名站群) 首先通过快照源码分析,并无太多特殊之处,...

    rustprimer-v1.13-大家新年快乐.pdf

    泛 型 可 变 性 、 所 有 权 、 租 借 和 生 命 期 所 有 权 引 用 和 借 用 生 命 周 期 闭 包 闭 包 的 语 法 闭 包 的 实 现 闭 包 作 为 参 数 和 返 回 值 集 合 类 型 C o lle c t io n s 动 态 数 组 Ve c 哈...

    泛用型贴标机_三维3D设计图纸.zip

    泛用型贴标机_三维3D设计图纸.zip

    B25 泛用型贴标机 shop112483501.taobao.com.zip

    【标题】"B25 泛用型贴标机 shop112483501.taobao.com.zip" 暗示了我们讨论的主题是一款名为"B25 泛用型贴标机"的自动化设备,它可能在淘宝网上销售,店铺编号为"shop112483501"。这款贴标机设计用于各种应用场景,...

    行业文档-设计装置-一种节能型高频无极泛光灯.zip

    标题中的“行业文档-设计装置-一种节能型高频无极泛光灯.zip”表明这是一个关于照明设备设计的专题文档,具体聚焦在节能型高频无极泛光灯的设计上。无极泛光灯是一种先进的照明技术,它采用了不同于传统有源电子镇流...

Global site tag (gtag.js) - Google Analytics