• 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();
    //	}
    	
    }
    
  • 相关阅读:
    【论文笔记】迁移自适应学习综述
    David Silver强化学习Lecture3:动态规划
    David Silver强化学习Lecture2:马尔可夫决策过程
    David Silver强化学习Lecture1:强化学习简介
    【论文笔记】深度人脸识别综述
    《构建之法》读书笔记
    个人作业——软件工程实践总结
    个人作业——关于K米的产品案例分析
    Hibernate简单增删改查
    Intellij IDEA中的Hibernate配置(MySQL8.0+Hibernate5.4.11)
  • 原文地址:https://www.cnblogs.com/tonglin0325/p/5257309.html
Copyright © 2020-2023  润新知