• Java 泛型高级


    1、限制泛型可用类型

    在定义泛型类别时,预设可以使用任何的类型来实例化泛型中的类型,但是如果想要限制使用泛型的类别时,只能用某个特定类型或者其子类型才能实例化该类型时,使用extends关键字指定这个类型必须是继承某个类,或者实现某个接口

    如下Code

    public class ListGenericFlag<T extends List> {
    
    	private T[] flagArray;
    
    	public T[] getFlagArray() {
    		return flagArray;
    	}
    
    	public void setFlagArray(T[] flagArray) {
    		this.flagArray = flagArray;
    	}
    
    	
    }
    

      

    测试:

    public static void main(String[] args) {
    		ListGenericFlag<LinkedList> flag1 = new ListGenericFlag<LinkedList>();
    		ListGenericFlag<ArrayList> flag2 = new ListGenericFlag<ArrayList>();
    		
    		LinkedList[] likedList = new LinkedList[10];
    		flag1.setFlagArray(likedList);
    		
    		ArrayList[] arrayLists = new ArrayList[10];
    		flag2.setFlagArray(arrayLists);
    
    	
    	}
    

      如果出入的是HashMap,就会显示出错

    2、当没有指定泛型继承的类型或接口时,默认使用T extends Object,所有默认情况下任何类型都可以作为参数传入。

    如下图Code,可以增加任何对象。

    3、现在有这样一个需求,需要实现如下

    flag = new GenericFlag<ArrayList>()

    flag = new GenericFlag<LinkedList()

     简单的说,实例化类型持有者时,它必须是实现List的类别或其子类别,要定义这样一个名词,可以使用“?”通配子元,并使用“extends”关键字限定类型持有者的型态。

    实现的Code如下

    public class GenericTest<T> {
    	
    	private T flag;
    	
    	public T getFlag() {
    		return flag;
    	}
    
    	public void setFlag(T flag) {
    		this.flag = flag;
    	}
    
    	public static void main(String[] args) {
    		//固定语法
    		GenericTest<? extends List>  g1 = null;
    		g1 = new GenericTest<ArrayList>();
    		g1 = new GenericTest<LinkedList>();	
    	}
    }
    

      

    super为list上面的(用的较少)

    		GenericTest<? super List>  g2 = null;
    		g2 = new GenericTest<Object>();
    

      

    4、泛型的继承

    定义了Parent类,里面有泛型T1和T2

    public class Parent<T1,T2> {
    	private T1 flag;
    	
    	private T2 flag2;
    
    	public T1 getFlag() {
    		return flag;
    	}
    
    	public void setFlag(T1 flag) {
    		this.flag = flag;
    	}
    
    	public T2 getFlag2() {
    		return flag2;
    	}
    
    	public void setFlag2(T2 flag2) {
    		this.flag2 = flag2;
    	}
    	
    	
    }
    

      定义了Child类,定义了T3。同时可以访问父类的T1和T2

    public class Child<T1,T2,T3> extends Parent<T1, T2> {
    	private T3 flag3;
    
    	public T3 getFlag3() {
    		return flag3;
    	}
    
    	public void setFlag3(T3 flag3) {
    		this.flag3 = flag3;
    	}
    	
    	
    }
    

      

    5、泛型接口的继承

    定义一个泛型接口

    public interface IParent<T1,T2> {
    	public void setFlag1(T1 flag1);
    	
    	public void setFlag2(T2 flag2);
    
    	public T1 getFlag1();
    	
    	public T2 getFlag2();
    	
    }
    

      

    定义泛型接口的实现类

    public class ChildClass<T1,T2> implements IParent<T1, T2> {
    	
    	private T1 flag1;
    	private T2 flag2;
    	
    	public void setFlag1(T1 flag1) {
    		this.flag1 = flag1;
    	}
    
    	public void setFlag2(T2 flag2) {
    		this.flag2 = flag2;
    	}
    
    	public T1 getFlag1() {
    		
    		return flag1;
    	}
    
    	public T2 getFlag2() {
    		
    		return flag2;
    	}
    
    }
    

      

  • 相关阅读:
    jQuery学习之过滤选择器
    ASP.net WebAPI 上传图片
    Mono for Android 显示远程图片
    C#引用非托管.dll
    c# 反射
    storyboard 中tableview 中的cell 手动更改高度 报错的解决办法。
    我也来开了博客记录我的开发之路
    openlayers点击地图图标,图标跳动 动画Demo实现 (复制内容至html文件可查看效果)
    element 分页多选表格换页时保留勾选数据---reverse-selection
    表单输入不显示,input弹窗选择不带回,角色不同样式差异等问题,可能的思路
  • 原文地址:https://www.cnblogs.com/linlf03/p/10901956.html
Copyright © 2020-2023  润新知