黑马程序员——Java之泛型

------Java培训、Android培训、iOS培训、Net培训、期待与您交流! -------

一、泛型的概念

       泛型就是允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态地指定(即传入实际的类型参数,也可称为类型实参)。Java 5 改写了集合框架中的全都接口和类,为这些接口、类增加了泛型支持,从而可以在声明集合变量、创建集合对象时传入类型实参。

       类型的作用:在集合中引入泛型,能够提供编译时的类型安全,并且从集合中取得元素后不必再强制转换,简化了程序代码。

二、泛型类和泛型方法

(1)泛型类

         泛型类是指包含类型参数的类,在泛型类的内部,类型参数可以用作变量的类型或方法返回参数的类型,一个泛型类可以包含多个类型参数。

         定义泛型类的语法格式如下:

         定义泛型接口的语法格式与定义泛型类类似,如下:

示例:

public class MyText<T> {
	private T x;
	private T y;
	
	public T getX() {
		return x;
	}
	public void setX(T x) {
		this.x = x;
	}
	public T getY() {
		return y;
	}
	public void setY(T y) {
		this.y = y;
	}

	public static void main(String[] args) {
		MyText<String> mt = new MyText<String>();
		mt.setX("精度为:100");
		mt.setY("纬度为:100");
		System.out.println(mt.getX());
		System.out.println(mt.getY());
	}
}

运行结果:

精度为:100
纬度为:100

        

        假如开发者想传入Integer类型的数据,可在MyText<String> mt = new MyText<String>();语句将String修改成Integer即可。所以使用了泛型大大提高了代码的效率,避免很多重复性工作。

(2)泛型方法

        泛型方法可以为类中的属性初始化,那么如果类中的属性通过泛型指定,而又需要通过构造方法设置属性内容的时候,那么构造方法的定义与之前并无不同,不需要像声明类那样指定泛型。

        定义泛型方法的语法格式:

 

示例:

public class MyText<T> {
	private T value;
	public MyText(T value ) {
		this.value = value;
	}
	public T getValue() {
		return value;
	}
	public void setValue(T value) {
		this.value = value;
	}
	

	public static void main(String[] args) {
		MyText<String> mt = new MyText<String>("构造方法中使用泛型");
		System.out.println(mt.getValue());
	}
}

运行结果:

构造方法中使用泛型

 

三、使用多个泛型

       有时在集合中需要同时放置多个对象类型。比如HashMap,必须同时放置key与value两个对象,它们成对出现,而且两个对象的类型还可能不一样。所以HashMap使用了多个类型,中间用逗号隔开。这两种泛型有先后顺序,第一种类型K为key,第二种类型V为value。

示例:

01.import java.util.Date;  
02.import java.util.HashMap;  
03.import java.util.Map;  
04.public class MyText{  
05.    public static void main(String[] args) {  
06.        //定义多个泛型,String类型和Date类型  
07.        Map<String, Date> map = new HashMap<String, Date>();  
08.        //put()方法向HashMap类中插入值  
09.        map.put("time_1", new Date());  
10.        map.put("time_2", new Date());  
11.        map.put("time_3", new Date());  
12.        //用增强for遍历循环数组  
13.        for (String key : map.keySet()) {  
14.            Date date= map.get(key);  
15.            System.out.printf("key: %1$s , Value: %2$tT%n" , key, date );  
16.        }  
17.    }  
18.}  

运行结果:

01.key: time_1 , Value: 12:51:19  
02.key: time_2 , Value: 12:51:19  
03.key: time_3 , Value: 12:51:19  


 

四、泛型通配符

   在泛型很多时候会用到泛型通配符,常用的泛型通配符主要有三种:界通配符“?”、上限通配符extends和下限通配符super。

(1)界通配符“?”

    泛型一个重要的特点是可以使用“?”作为通配符来匹配任何数据类型。

    界通配符“?”的语法格式如下:

 

示例:

import java.util.ArrayList;
import java.util.List;
public class Mywenhao {
    //参数使用了泛型通配符
	public void print(List<?> list){
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
	}
	
	public static void main(String[] args) {
		//创建泛型List并打印str元素
		List<String> Str = new ArrayList<String>();
		Str.add("One");
		Str.add("dream");
		Str.add(".");
		Mywenhao test = new Mywenhao();
		test.print(Str);
	}
	
}

运行结果:

One
dream
.

(2)上限通配符extends

    参数类型可以用我们想用的任何类型参数进行实例化,但是对于其他某些类,我们也许想将可能的类型参数集合限定为给定范围的子类型。这时可以使用extends关键字来限制参数类型,用法如下:

示例:

import java.util.Hashtable;

public class Mywenhao <K extends Number , V>{
	public Hashtable<K , V> ha = new Hashtable<K , V>();
	//定义put和get方法
	private void put(K k,V v) {
		ha.put(k , v);
	}
	public V get(K k) {
		return ha.get(k);
	}

public static void main(String[] args) {
	Mywenhao<Integer, String> t = new Mywenhao<Integer, String>();
	t.put(1,"One");
	String str = t.get(1);
	System.out.println(str);
    }

}

运行结果:

One

(3)下限通配符super

    通常我们用到的都是上限通配符,其实还有一个下限通配符super,用来限制泛型最小的范围。下限通配符super的用法如下:


示例:

import java.util.ArrayList;
import java.util.List;

public class MyTest {

	public static void main(String[] args) {
		List<? super Number>  numSuper = new ArrayList<Number>();
		numSuper.add(3);
		numSuper.add(new Float(3.14));
		System.out.println(numSuper);
	}
}

运行结果:

[3,  3.14]

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值