Java学习笔记9(泛型)

Java学习笔记九(泛型)

 

 1.介绍

所谓的泛型就是将类型作为一种参数来传递,有了泛型后类型不再是一成不变的,可以通过泛型参数来指定。可以提供程序开发的灵活性。


 2.泛型类或接口的使用

泛型类声明时,与普通类没有太大的区别,只是在类中加入了类型变量的声明

public class 类名<类型变量>{..........................................................................}

<span style="font-family:SimSun;font-size:18px;">package com.fanxing;

//自定义的泛型类
class MyValue<T,U>
{
	//定义两个由类型变量指定类型的成员变量
	private T value1;
	private U value2;
	//定义两个成员变量的set方法,其参数类型由类型变量确定
	public void setValue(T newValue1,U newValue2)
	{
		this.value1=newValue1;
		this.value2=newValue2;
	}
	//value1成员变量的get方法
	public T getValue1()
	{
		return this.value1;
	}
	//value2成员变量的get方法
	public U getValue2()
	{
		return this.value2;
	}
}
//主类
public class Sample35_1
{
	public static void main(String args[]) 
	{
		//创建自定义泛型类的对象,并指定两个类型变量
		MyValue<String,Integer> mv1=new MyValue<String,Integer>();
		//调用set方法对成员变量进行设置
		mv1.setValue("你好该参数为字符串类型",new Integer(100));
		//返回第一个成员变量的值
		String str=mv1.getValue1();
		//返回第二个成员变量的值
		Integer num=mv1.getValue2();
		//将两个值进行打印
		System.out.println("mv1对象的第一个参数值为:"+str+"  第二个参数值为:"+num+"。");
		//创建另一个自定义泛型类的对象,并另外指定两个类型变量
		MyValue<Integer,String> mv2=new MyValue<Integer,String>();
		//调用set方法对成员变量进行设置
		mv2.setValue(new Integer(100),"你好该参数为字符串类型");
		//返回第一个成员变量的值
		num=mv2.getValue1();
		//返回第二个成员变量的值
		str=mv2.getValue2();
		//将两个值进行打印
		System.out.println("mv2对象的第一个参数值为:"+num+"  第二个参数值为:"+str+"。");
	}
}
</span>


上述实例中自定义了一个泛型类MyValue,有两个类型参数T与U,并且成员变量也都是由类型参数在指定。接下来在创建泛型类MyValue的对象时,为类型变量指定了明确的类型值。


 3.泛型方法

在Java中也支持泛型方法,并且比泛型类更加的灵活。

public static <类型变量> 返回类型 方法名(参数列表){}

<span style="font-family:SimSun;font-size:18px;">package com.fanxing;

public class Sample35_2
{
	
	public <T> void PrintTest(T t1){		
		System.out.println(t1);
	}
	
	//自定义的泛型方法
	public static <T> T getLast(T[] a)
	{
		
		//返回指定类型数组的最后一个元素
		return a[a.length-1];
	} 
	public static void main(String args[]) 
	{
		//创建字符串类型的数组
		String[] str={"这里是第一个元素","这里是第二个元素","这里是第三个元素"};
		//使用泛型方法,并为其指定类型参数
		String laststr=Sample35_2.<String>getLast(str);
		//打印结果
		System.out.println("String数组str的最后一个元素为:“"+laststr+"”。");
		//创建Integer类型数组
		Integer[] num={new Integer(100),new Integer(200),new Integer(300)};
		//使用泛型方法,但并没有显式指定类型参数
		Integer lastnum=Sample35_2.getLast(num);
		
		Sample35_2 a=new Sample35_2();
		a.PrintTest("你好吗");
		//打印结果
		System.out.println("Integer数组num的最后一个元素为:“"+lastnum+"”。");
	}
}
</span>

上述就是泛型方法的使用,一般泛型方法以静态方法居多



 4.类型变量的限制

如果想对类型变量进行限制的话,这时就需要使用类型变量的限制,具体语法如下

类型变量 extends 限定类型序列

限定类型序列,可以是类、接口等,多个限制之间通过&隔开

<span style="font-family:SimSun;font-size:18px;">package com.fanxing;

import java.io.*;
//定义泛型类,并对类型参数进行限定
class MyValue1<T extends Number&Comparable&Serializable>
{
	//定义由类型参数指定类型的成员变量
	private T value;
	//成员变量的set方法
	public void setValue(T newValue)
	{
		this.value=newValue;
	}
	//成员变量的get方法
	public T getValue()
	{
		return this.value;
	}
}
//主类
public class Sample35_3
{
	public static void main(String args[]) 
	{
		//创建类型参数指定为Integer的MyValue对象
		MyValue1<Integer> mv=new MyValue1<Integer>();
		//设置mv中的值
		mv.setValue(new Integer(200));
		//获取mv中的值
		Integer num=mv.getValue();
		//打印该值
		System.out.println("mv对象中的值为:"+num
		+"该值既属于Number类又实现了Comparable与Serializable。");
	}
}
</span>

上述实例就是对类型变量进行了限定,限定为Number并且可序列化




版权声明:本文为博主原创文章,未经博主允许不得转载。