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>();
原文:https://www.cnblogs.com/linlf03/p/10901956.html