work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Java 泛型高级

Posted on 2019-05-21 19:51  work hard work smart  阅读(148)  评论(0编辑  收藏  举报

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;
	}

}