Java泛型

泛型就是指在对象建立时不指定类中属性的具体类型,而由外部在声明及实例化对喜爱时指定类型。

在泛型的指定中无法指定基本数据类型的,必须设置成一个类,这样在设置一个数字时就必须使用包装类。

//=================================================
// File Name       :	Generics_demo
//------------------------------------------------------------------------------
// Author          :	Common

//泛型名:Point
//属性:
//方法:
class Point<T>{								//此处T可以是任意的标识符号,T是type的简称
	private T var;								//此变量的类型由外部决定

	public T getVar() {					//返回值的类型由外部决定
		return var;
	}

	public void setVar(T var) {	//设置的类型由外部指定
		this.var = var;
	}
	

}



//主类
//Function        : 	Generics_demo
public class Generics_demo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
//		Point<Integer> p = new Point<Integer>();	//里面的var类型为Integer类型
//		p.setVar(30);  														//设置数字,自动装箱
//		System.out.println(p.getVar()*2);					//计算结果,按数字取出
		Point<String> p = new Point<String>();	//里面的var类型为Integer类型
		p.setVar("张三");  														//设置数字,自动装箱
		System.out.println(p.getVar().length());					//计算结果,按数字取出
	}

}

泛型的构造方法

//=================================================
// File Name       :	Generics_demo
//------------------------------------------------------------------------------
// Author          :	Common

//泛型名:Point
//属性:
//方法:
class Point<T>{								//此处T可以是任意的标识符号,T是type的简称
	private T var;								//此变量的类型由外部决定
	
	public Point(T var) {					//构造方法
		super();
		this.var = var;
	}

	public T getVar() {					//返回值的类型由外部决定
		return var;
	}

	public void setVar(T var) {	//设置的类型由外部指定
		this.var = var;
	}
	

}



//主类
//Function        : 	Generics_demo
public class Generics_demo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
//		Point<Integer> p = new Point<Integer>();	//里面的var类型为Integer类型
//		p.setVar(30);  														//设置数字,自动装箱
//		System.out.println(p.getVar()*2);					//计算结果,按数字取出
		
//		Point<String> p = new Point<String>();	//里面的var类型为Integer类型
//		p.setVar("张三");  														//设置数字,自动装箱
//		System.out.println(p.getVar().length());					//计算结果,按数字取出
		
		Point<String> p = new Point<String>("张三");
		System.out.println("内容:"+p.getVar());	
	}

}

指定多个泛型类型

//=================================================
// File Name       :	Generics_demo
//------------------------------------------------------------------------------
// Author          :	Common

//泛型名:Point
//属性:
//方法:
class Point<T>{								//此处T可以是任意的标识符号,T是type的简称
	private T var;								//此变量的类型由外部决定
	
	public Point(T var) {					//构造方法
		super();
		this.var = var;
	}

	public T getVar() {					//返回值的类型由外部决定
		return var;
	}

	public void setVar(T var) {	//设置的类型由外部指定
		this.var = var;
	}
	

}

//泛型名:Notepad
//属性:
//方法:
class Notepad<K,V>{								//此处T可以是任意的标识符号,T是type的简称
	private K key;											//此变量的类型由外部决定
	private V value;										//此变量的类型由外部决定
	
	public Notepad(K key, V value) {		//构造方法
		super();
		this.key = key;
		this.value = value;
	}
	public K getKey() {
		return key;
	}
	public void setKey(K key) {
		this.key = key;
	}
	public V getValue() {
		return value;
	}
	public void setValue(V value) {
		this.value = value;
	}
	
}




//主类
//Function        : 	Generics_demo
public class Generics_demo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
//		Point<Integer> p = newdd Point<Integer>();	//里面的var类型为Integer类型
//		p.setVar(30);  														//设置数字,自动装箱
//		System.out.println(p.getVar()*2);					//计算结果,按数字取出
		
//		Point<String> p = new Point<String>();	//里面的var类型为Integer类型
//		p.setVar("张三");  														//设置数字,自动装箱
//		System.out.println(p.getVar().length());					//计算结果,按数字取出
		
//		Point<String> p = new Point<String>("张三");
//		System.out.println("内容:"+p.getVar());
		
		Notepad<String,Integer> t = new Notepad<String,Integer>("张三",18);
		System.out.println(t.getKey());
		System.out.println(t.getValue());
		
	}
}

通配符

//=================================================
// File Name       :	Generics_demo
//------------------------------------------------------------------------------
// Author          :	Common

//泛型名:Point
//属性:
//方法:
class Point<T>{								//此处T可以是任意的标识符号,T是type的简称
	private T var;								//此变量的类型由外部决定
	
	public Point(T var) {					//构造方法
		super();
		this.var = var;
	}
	
	public String toString(){			//覆写Object类中的toString()方法
		return this.var.toString();
	}

	public T getVar() {					//返回值的类型由外部决定
		return var;
	}

	public void setVar(T var) {	//设置的类型由外部指定
		this.var = var;
	}
	

}

//泛型名:Notepad
//属性:
//方法:
class Notepad<K,V>{								//此处T可以是任意的标识符号,T是type的简称
	private K key;											//此变量的类型由外部决定
	private V value;										//此变量的类型由外部决定
	
	public Notepad(K key, V value) {		//构造方法
		super();
		this.key = key;
		this.value = value;
	}
	public K getKey() {
		return key;
	}
	public void setKey(K key) {
		this.key = key;
	}
	public V getValue() {
		return value;
	}
	public void setValue(V value) {
		this.value = value;
	}
	
}




//主类
//Function        : 	Generics_demo
public class Generics_demo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根

		Point<String> p = new Point<String>("张三");
		fun(p);
	}
	
	public static void fun(Point<?> point){			//使用泛型接收Point的对象
		System.out.println("内容:" + point);
	}
	
}

受限泛型

在引用传递中,在泛型操作中也可以设置一个泛型对象的范围上限和范围下限。

范围上限使用extends关键字声明,标识参数化的类型可能是所指定的类型或者是此类型的子类。

范围下限使用super关键字声明,标识参数化的类型可能是所指定的类型,或者是此类型的父类型,或是Object类。

范围上限

import java.awt.datatransfer.FlavorTable;

//=================================================
// File Name       :	Generics_demo
//------------------------------------------------------------------------------
// Author          :	Common

//泛型名:info
//属性:
//方法:
class info<T extends Number>{	//在声明的地方指定泛型的上限范围
//class info<T>{								//此处T可以是任意的标识符号,T是type的简称
	private T var;								//此变量的类型由外部决定
	
	public info(T var) {					//构造方法
		super();
		this.var = var;
	}
	
	public String toString(){			//覆写Object类中的toString()方法
		return this.var.toString();
	}

	public T getVar() {					//返回值的类型由外部决定
		return var;
	}

	public void setVar(T var) {	//设置的类型由外部指定
		this.var = var;
	}
	

}




//主类
//Function        : 	Generics_extends_demo
public class Generics_extends_demo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		
		info<Float> i1 = new info<Float>(10.1f);			//声明并实例化Float类型的泛型对象
		info<Integer> i2 = new info<Integer>(10);		//声明并实例化Integer类型的泛型对象
		fun(i1);																		//是数字可以传递
		fun(i2);																		//是数字可以传递
	}
	
	public static void fun(info<?> temp){			//使用泛型接收info的对象
//	public static void fun(info<? extends Number> temp){			//使用泛型接收info的对象
		System.out.println("temp:" + temp);
	}
		
	

}

范围下限

import java.awt.datatransfer.FlavorTable;

//=================================================
// File Name       :	Generics_demo
//------------------------------------------------------------------------------
// Author          :	Common

//泛型名:info
//属性:
//方法:
//class info<T extends Number>{	//在声明的地方指定泛型的上限范围
class info<T>{								//此处T可以是任意的标识符号,T是type的简称
	private T var;								//此变量的类型由外部决定
	
	public info(T var) {					//构造方法
		super();
		this.var = var;
	}
	
	public String toString(){			//覆写Object类中的toString()方法
		return this.var.toString();
	}

	public T getVar() {					//返回值的类型由外部决定
		return var;
	}

	public void setVar(T var) {	//设置的类型由外部指定
		this.var = var;
	}
	

}




//主类
//Function        : 	Generics_extends_demo
public class Generics_extends_demo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		
//		info<Float> i1 = new info<Float>(10.1f);			//声明并实例化Float类型的泛型对象
//		info<Integer> i2 = new info<Integer>(10);		//声明并实例化Integer类型的泛型对象
		
		info<Object> i1 = new info<Object>(new Object());	//声明并实例化Object类型的泛型对象
		info<String> i2 = new info<String>("张三");					//声明并实例化String类型的泛型对象
		fun(i1);																		//是数字可以传递
		fun(i2);																		//是数字可以传递
	}
	
//	public static void fun(info<?> temp){			//使用泛型接收info的对象
//	public static void fun(info<? extends Number> temp){			//使用泛型接收info的对象
	public static void fun(info<? super String> temp){			//使用泛型接收info的对象
		System.out.println("temp:" + temp);
	}
		
	

}

泛型接口

定义泛型接口

定义子类方式<1>——在子类的定义上声明泛型类型

//=================================================
// File Name       :	Generics_demo
//------------------------------------------------------------------------------
// Author          :	Common

//接口名:info
//属性:
//方法:
interface Info_1<T>{
	public T getVar();
}

//泛型类名:info
//属性:
//方法:
class InfoImp<T> implements Info_1<T>{
	
	private T var;							//定义属性
	
	public InfoImp(T var) {		//构造方法
		super();
		this.var = var;
	}

	public void setVar(T var) {
		this.var = var;
	}

	@Override
	public T getVar() {
		// TODO 自动生成的方法存根
		return this.var;
	}
	
}

//主类
//Function        : 	Generics_extends_demo
public class Generics_Interface_demo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		InfoImp<String> p = new InfoImp<String>("张三");
		System.out.println("内容:"+p.getVar());
	}

}

定义子类方式<2>——直接在接口中指定具体类型

//=================================================
// File Name       :	Generics_demo
//------------------------------------------------------------------------------
// Author          :	Common

//接口名:info
//属性:
//方法:
interface Info_1<T>{
	public T getVar();
}

//泛型类名:info
//属性:
//方法:
class InfoImp implements Info_1<String>{//定义泛型接口的子类,指定类型为String
//class InfoImp<T> implements Info_1<T>{	//定义泛型接口的子类
	
//	private T var;							//定义属性
	private String var;							//定义属性
	
//	public InfoImp(T var) {		//构造方法
	public InfoImp(String var) {		//构造方法
		super();
		this.var = var;
	}

//	public void setVar(T var) {
	public void setVar(String var) {
		this.var = var;
	}

	@Override
//	public T getVar() {
	public String getVar() {
		// TODO 自动生成的方法存根
		return this.var;
	}
	
}

//主类
//Function        : 	Generics_extends_demo
public class Generics_Interface_demo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		InfoImp p = new InfoImp("张三");
		System.out.println("内容:"+p.getVar());
	}

}

定义泛型方法

//=================================================
// File Name       :	Generics_demo
//------------------------------------------------------------------------------
// Author          :	Common


//类名:Demo_Generics
//属性:
//方法:
class Demo_Generics{
	public <T> T fun(T t){		//可以接收任意类型的数据
		return t;
	}
}

//接口名:info
//属性:
//方法:
interface Info_1<T>{
	public T getVar();
}

//泛型类名:info
//属性:
//方法:
class InfoImp implements Info_1<String>{//定义泛型接口的子类,指定类型为String
//class InfoImp<T> implements Info_1<T>{	//定义泛型接口的子类
	
//	private T var;							//定义属性
	private String var;							//定义属性
	
//	public InfoImp(T var) {		//构造方法
	public InfoImp(String var) {		//构造方法
		super();
		this.var = var;
	}

//	public void setVar(T var) {
	public void setVar(String var) {
		this.var = var;
	}

	@Override
//	public T getVar() {
	public String getVar() {
		// TODO 自动生成的方法存根
		return this.var;
	}
	
}

//主类
//Function        : 	Generics_extends_demo
public class Generics_Interface_demo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
//		InfoImp p = new InfoImp("张三");
//		System.out.println("内容:"+p.getVar());
		
		Demo_Generics d = new Demo_Generics();
		String str = d.fun("张三");		//传递字符串
		int i = d.fun(30);							//传递数字,自动装箱
		System.out.println(str);
		System.out.println(i);
	}

}

通过泛型方法返回泛型类实例

//=================================================
// File Name       :	Generics_demo
//------------------------------------------------------------------------------
// Author          :	Common

//泛型名:info
//属性:
//方法:
class info<T extends Number>{	//在声明的地方指定泛型的上限范围
//class info<T>{								//此处T可以是任意的标识符号,T是type的简称
	private T var;								//此变量的类型由外部决定
	
//	public info(T var) {					//构造方法
//		super();
//		this.var = var;
//	}
	
	public String toString(){			//覆写Object类中的toString()方法
		return this.var.toString();
	}

	public T getVar() {					//返回值的类型由外部决定
		return var;
	}

	public void setVar(T var) {	//设置的类型由外部指定
		this.var = var;
	}
	

}




//主类
//Function        : 	Generics_extends_demo
public class Generics_extends_demo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
				
		info<Integer> i = fun(30);						//传递整数到fun()方法
		System.out.println(i.getVar());

	}
		
	public static <T extends Number> info<T> fun (T param){	//fun返回的参数类型是info<T>
		info<T> temp = new info<T>();		//根据传入的数据类型实例化info对象
		temp.setVar(param);							//将传递的内容设置到info类中的var属性之中
		return temp;										//返回实例化对象
		
	}

}
//=================================================
// File Name       :	Generics_demo
//------------------------------------------------------------------------------
// Author          :	Common

//泛型名:info
//属性:
//方法:
//class info<T extends Number>{	//在声明的地方指定泛型的上限范围
class info<T>{								//此处T可以是任意的标识符号,T是type的简称
	private T var;								//此变量的类型由外部决定
	
//	public info(T var) {					//构造方法
//		super();
//		this.var = var;
//	}
	
	public String toString(){			//覆写Object类中的toString()方法
		return this.var.toString();
	}

	public T getVar() {					//返回值的类型由外部决定
		return var;
	}

	public void setVar(T var) {	//设置的类型由外部指定
		this.var = var;
	}
	

}




//主类
//Function        : 	Generics_extends_demo
public class Generics_extends_demo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
			
		info<String> i1 = new info<String>();		//设置String为泛型类型
		info<String> i2 = new info<String>();		//设置String为泛型类型
		i1.setVar("HELLO");									//设置内容
		i2.setVar("张三");										//设置内容
		add(i1,i2);
	}
		
	
	public static <T> void add(info<T> i1,info<T> i2){
		System.out.println(i1.getVar()+""+i2.getVar());
	}

}

泛型数组

程序从fun1()方法返回一个泛型数组,在fun1()方法接收参数时使用了可变参数传递方式,然后将fun1()返回的泛型数组内容交给fun2()方法进行输出。

//=================================================
// File Name       :	Generics_array_demo
//------------------------------------------------------------------------------
// Author          :	Common



//主类
//Function        : 	Generics_array_demo
public class Generics_array_demo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Integer i[] = fun1(1,2,3,4,5);				//返回泛型数组
		fun2(i);												//输出数组内容
	}
	
	public static <T> T[] fun1(T...arg){	//接收可变参数,返回泛型数组
		return arg;											//返回泛型数组
	}

	public static <T> void fun2(T param[]){
		System.out.println("接收泛型数组:");	//接收泛型数组
		for(T t:param){
			System.out.println(t+"、");
		}
		System.out.println();
	}
	
}

泛型应用

一个人有联系方式、基本信息等,这些信息的类型可以通过泛型进行声明,然后传给Person

//=================================================
// File Name       :	Generics_array_demo
//------------------------------------------------------------------------------
// Author          :	Common

//接口名:Generics_array_interface
//属性:
//方法:
interface Generics_array_interface{		//定义一个标识接口,此接口没有定义任何方法
	
}

//类名:Contact
//属性:
//方法:
class Contact implements Generics_array_interface{		//实现Generics_array_interface接口

	private String address;				//联系地址
	private String telephone;				//联系方式
	private String zipcode;					//邮政编码
	
	public Contact(String address, String telephone, String zipcode) {	//构造方法
		super();
		this.address = address;
		this.telephone = telephone;
		this.zipcode = zipcode;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getTelephone() {
		return telephone;
	}

	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}

	public String getZipcode() {
		return zipcode;
	}

	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}
	
	public String toString(){			//覆写Object类中的toString()方法
			return "联系方式:"+"
"+"联系电话:"+this.telephone+"联系地址:"+this.address+"邮政编码:"+this.zipcode;
	}
	
	
}

//类名:Introduction
//属性:
//方法:
class Introduction implements Generics_array_interface{
	private String name;
	private String sex;
	private int age;
	
	public Introduction(String name, String sex, int age) {	//构造方法
		super();
		this.name = name;
		this.sex = sex;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	public String toString(){			//覆写Object类中的toString()方法
		return "基本信息:"+"
"+"姓名:"+this.name+"性别:"+this.sex+"年龄:"+this.age;
	}
	
}

//类名:Person_
//属性:
//方法:
class Person_ <T extends Generics_array_interface>{
	private T info;

	public Person_(T info) {	//构造方法
		super();
		this.info = info;
	}

	public T getInfo() {
		return info;
	}

	public void setInfo(T info) {
		this.info = info;
	}

	@Override
	public String toString() {			//覆写Object类中的toString()方法
		return this.info.toString();
	}
	
}

//主类
//Function        : 	Generics_array_demo
public class Generics_array_demo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
//		Integer i[] = fun1(1,2,3,4,5);				//返回泛型数组
//		fun2(i);												//输出数组内容
		
		Person_ <Contact> per = null;	//声明Person_对象,同时指定Contact类型
		per = new Person_<Contact>(new Contact("北京市","010010101010","100876"));//实例化Person_对象,同时设置信息
		System.out.println(per);
	}
	
//	public static <T> T[] fun1(T...arg){	//接收可变参数,返回泛型数组
//		return arg;											//返回泛型数组
//	}
//
//	public static <T> void fun2(T param[]){
//		System.out.println("接收泛型数组:");	//接收泛型数组
//		for(T t:param){
//			System.out.println(t+"、");
//		}
//		System.out.println();
//	}
	
}
原文地址:https://www.cnblogs.com/tonglin0325/p/5257309.html