java基础之泛型用法

1.什么是泛型

泛型是java中保障类型安全的一种机制。它通过对变量类型的假设,实现变量类型的进行限制,从而在一定程度上保证程序编译时变量类型的安全。反之,如果没有泛型,这些假设则只存在于程序员的大脑中,这样会导致类型转换的异常在程序运行时才被发现。

	//不用泛型
		List list1 = new ArrayList();
		list1.add(1);
		Object o = list1.get(0);  //返回Object类型对象
		Integer i = (Integer) o;  //需预先知道类型

		//用泛型
		List<String> list2 = new ArrayList<String>();
		list2.add("aaa");
		String str = list2.get(0);    //直接返回定义时指定的类型,防止类型转换异常

2.多泛型

多泛型是指,在一个类型定义时使用多个泛型。在Map中多见多泛型的应用。如下:

Map<String,String> map = new HashMap<String,String>();
		Set<Map.Entry<String,String>> set = map.entrySet();
		for(Iterator<Map.Entry<String,String>> iter = set.iterator();iter.hasNext();){
			String key = iter.next().getKey();
			String value = iter.next().getValue();
		}
//多泛型定义
public class MutilGeneric<T,E> {
<span style="white-space:pre">	</span>private T attr1; //定义成员变量
<span style="white-space:pre">	</span>private E attr2;

3.限制泛型可用类型

不限制泛型类别时,可以使用任何类型来实例化泛型类型中的类型。即在不设置默认类型时,泛型类型通常是Object,但在实际开发中,我们往往需要对类型加以限制,指定泛型类型只能在一定的范围内。java泛型中给我们提供了这样的机制,通过extends关键字,我们就可以指定泛型类型范围,这里指定的类型必须是继承自某个类或实现某个接口。具体定义如下:

/**
 * 定义泛型类,限制类型只能为List<Person>的子类
 * @author caoxr
 * @param <T>
 */
public class PersonSeqUtil<T extends List<Person>> {

4.类型通配符<?>或<? extends ClassType>

个人理解类型通配符的使用,是为了实现在定义泛型类持有者时,限制泛型可用类型的范围,扩展泛型类型持有者对象可接纳类型的范围。代码示意如下:

	PersonSeqUtil<LinkedList<Person>> psu1 = new PersonSeqUtil<LinkedList<Person>>();
		PersonSeqUtil<ArrayList<Person>> psu2 = new PersonSeqUtil<ArrayList<Person>>();
		//运用通配符定义PersonSeqUtil对象,使其传入类型只能为List<person>的子类
		PersonSeqUtil<? extends List<Person>> psu = null;
		psu = new PersonSeqUtil<LinkedList<Person>>();
		psu = new PersonSeqUtil<ArrayList<Person>>();
		//也可以通过super定义,要求指定类型为指定继承类型的父类
		PersonSeqUtil<? super ArrayList<Person>> psu3 = null;
		psu3 = new PersonSeqUtil<List<Person>>();

		List<? extends Object> list = new ArrayList<Object>();
		list.add(null);
		list.add("haha");  //报错,编译不通过

注意上述代码中,当向list中add null时,代码是编译通过的,而当放入字符串“haha”时,则编译不通过,按常理分析,Object类为所以类型的父类,应该是编译通过的。但事实上并非如此,因为从list的定义来看,list只允许放Object的子类,但不知道具体放什么类型,如果能放入具体类型的话,这就意味着当我们再取出时,必须记得它是什么类型,然后强制转换获得该放进去的值,这样就失去了泛型的意义。

java基础之泛型用法,布布扣,bubuko.com

时间: 2024-10-16 02:25:25

java基础之泛型用法的相关文章

java基础之synchronized用法

首先,参考文章:http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html PS:参考文章很长,但内容非常丰富,若是初学者,更要有耐心读完. 第二,个人小结: 关于synchronized关键字的作用: 1.在某个对象的所有synchronized方法中,在某一时刻,只能有一个唯一的一个线程去访问这些synchronized方法 2.如果一个方法是synchronized方法,那么该synchronized关键字表示给当前对

Java基础:泛型

Java的泛型是什么呢, 就是类型的参数化,这得类型包括方法参数和返回值,也就是原本该是确定类型的地方换成了变量,把类型的确定时间向后延迟了. 在之前,学过"重载"的概念,重载是什么呢,举例来说 public class Test{ // 处理整型数据 void receive(int i) { System.out.println("Received one int data"); System.out.println("i="+i); } /

Java基础巩固----泛型

注:参考书籍:Java语言程序设计.本篇文章为读书笔记,供大家参考学习使用   1.使用泛型的主要优点是能够在编译时而不是在运行时检查出错误,提高了代码的安全性和可读性,同时也提高了代码的复用性. 1.1如何理解泛型的使用提高了代码的安全性? 答:例如这样一段代码: ArrayList<Date> arrayList = new ArrayList<Date>(); arrayList.add(new Date()); arrayList.add("data")

java基础之泛型的继承

关于泛型的基本介绍和理解请参考以下几篇文章,或查询更多资料: 泛?型?与?泛?型?继?承 泛型(包括泛型抽象类的继承) 泛型的继承测试 本篇以简单的List<>方式来进行说明. ArrayList<Object>继承了List<Object>, ArrayList<String>没有继承List<Object> List<?>等价于List<? extends Object> 请参考以下代码: /** * author D

Java基础:泛型详解

泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用.什么是泛型?为什么要使用泛型? 泛型,即“参数化类型”.一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参).泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型).也

JAVA基础_泛型

什么是泛型 泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉"类型"信息,是程序的运行效率不受影响,对于参数化的泛型类型,getClass()方法返回值和原始类型完全一样.由于编译生成的字节码会擦除泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据,例如,用反射得到集合,然后再调用add()方法即可 GenericDemo.java public class GenericDemo

黑马程序员——【Java基础】——泛型、Utilities工具类、其他对象API

一.泛型 (一)泛型概述 1.泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制. 2.泛型技术是给编译器使用的技术,用于编译时期,确保类型的安全. 3.泛型的擦除:运行时,会将泛型去掉,生成class文件中的是不带泛型的,这个称为“泛型的擦除”.擦除泛型的原因是为了兼容运行时的类加载器. 4.泛型的好处:(1)将运行时期出现的问题ClassCastException,转移到了编译时期.方便于程序员解决问题,让运行时期问题减少.安全.(2)避免了强制转换的麻烦. 5.泛

Java基础:泛型及其擦除性、不可协变性

转载请注明出处:jiq?钦's technical Blog 1泛型语法: 泛型类: class ClassName<T>{} 泛型方法:public <T> void f(T x){} 基本指导原则:如果使用泛型方法可以取代将整个类泛型化,那么就应该使用泛型方法,因为它可以让事情更加清楚. 2为什么使用泛型? 在Java SE1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的"任意化","任意化"带来的缺点是要做显式的

java基础入门-泛型(1)

为什么需要使用泛型? 1.代码复用 2.保证类型安全 3.编程的便利 第一部分,先说说代码复用 1)建立一个Animal的父类 package com.ray.test; public class Animal { private String name="Animal"; public String getName() { return name; } public void setName(String name) { this.name = name; } } 2)建立连个Ani