Java基础——泛型
在集合中没有使用泛型时:
1.任何Object及其子类的对象都可以添加进来
2.从类中取出,强转为某一类型时,可能会有ClassCastException异常
1.在集合中使用泛型:
格式:List<Integer> list = new ArratList<Integer>();
注:<>中只能填引用数据类型Integer,不能填入基本数据类型int
Map<String, Integer> map = new HashMap<String, Integer>();
或Map<String, Integer> map = new HashMap<>();
Set<Map.Entry<String, Integer>> set = map.entrySet();
for(Map.Entry<String, Integer> s: set){
}
2.自定义泛型类、泛型接口、泛型方法
public class Order<T>{ 里面涉及到该类型的都用T代替,构造器,get set方法,toString方法都可以有,正常写即可}
1.使用(实例化泛型类的对象时,指明泛型的类型。指明以后,对应类中使用了泛型的位置,都实例化为指定的泛型的类型)
Order<Boolean> order = new Order<Boolean>();
2.当实例化时没有使用,默认是Object型的 Order order = new Order();
3.继承泛型类或泛型接口时,可以指明泛型的类型
class SubOrder extends Order<Customer>{ 属性和方法就都是Customer的类型了}
也可以不指明:
class SubOrder<T> extends Order<T>{ 属性和方法就都是T的类型}
4.声明泛型方法:public <E> E getE(E e){ return e;}
public <E> List<E> copyToList(E e, List<E> list){ for(E e1: e){ list.add(e1); } return list; }
5.当通过对象调用泛型方法时,指明泛型方法的类型
Integer i = order.getE(23);
3.泛型与继承的关系
A类是B类的子类,但是List<A>不是List<B>的子接口,两者是并列关系
List<Object> list1 = null; List<String> list2 = new ArrayList<String> (); list1 = list2;//类型不匹配(不能这样操作)
4.通配符 ?
A类是B类的子类,G是带泛型声明的类或接口,那么G<?>是G<A>、G<B>的父类
List<?> 是List<A>、List<B>...的父类 List<?> list = null; List<Object> list1 = new ArrayList<Object> (); List<String> list2 = new ArrayList<String> (); list = list1; list = list2;//这样是可以的
? extends A:可以存放A及A的子类
? super A:可以存放A及其父类
注:不允许向声明为通配符的集合中写入对象,但是可以读取声明为通配符的集合类的对象
Iterator<?> iteraotr = list.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next());//这里是Object的 }
list.add("aa");是不允许的。
但是可以存null list.add(null);
5.静态方法中不能使用类的泛型。
6.如果泛型类是一个接口或抽象类,则不可创建泛型类的对象。
7.不能在catch中使用泛型
8.从泛型类派生子类,泛型类型需具体化