20170507@ 泛型进阶

来源:互联网 发布:数据分析师证书考试 编辑:程序博客网 时间:2024/06/01 08:54

带有泛型的类:

ArrayList<E>

E:element,元素,实际代表一个变量,接收一个数据类型(代表一个比较广泛的数据类型)。

带有泛型的方法:

public boolean add(E e){}

应用举例

//创建集合并添加元素ArrayList<Integer>  array = new ArrayList<Integer>();        array.add(365);        array.add(673);        array.add(715);        //产生一个数组作参数        Integer[] in = new Integer[array.size()];        //使用带泛型的方法集合转数组        Integer[] result = array.toArray(in);        //增强for循环遍历数组        for(Integer i : result){            System.out.println(i);        } 

带有泛型的接口:

List<E>

实现类在实现接口的时,有两种可选择的方式。
1.实现接口时,不处理泛型。

public class ArrayList<E> implements List<E>{}//这种情况下,调用者在调用ArrayList类时new ArrayList<Integer>()

相当于在后期创建集合对象时,再指定数据类型。
2.实现接口时,处理泛型。

public class XX<Integer> implements List<Integer>{}//这种情况下,调用者在调用ArrayList类时,不能写数据类型了new XXX

这两者相比,前者更为灵活,后者把数据类型写死了。

使用泛型的好处:
1.更安全 。
2.避免强制类型转换 。
3.代码中的错误在编译时就可以发现。
4.带来了传说中的增强for。

泛型的通配符:

ArrayList<String> array = new ArrayList<String>();        HashSet<Integer> set = new HashSet<Integer>();        array.add("lc");        array.add("ccc");        set.add(132);        set.add(321);        iterator(array);        iterator(set);    //要求定义一个方法,可以同时迭代这两个集合    //参数:不可以写ArrayList,HashSet。只能共同实现的接口Collection。    public static void iterator(Collection<?> coll){        Iterator<?> it =coll.iterator();         while(it.hasNext()){            System.out.println(it.next());        }

运行结果:

lcccc321132

更多…
(这里只列出部分代码)

//要求://将酒店的初始,服务员,经理,存储在三个集合中。//再定义一个方法,可以同时遍历三个集合,还可以调用它们的工作方法。        ArrayList<Cook> cook = new ArrayList<Cook>();        ArrayList<Waiter> waiter = new ArrayList<Waiter>();        ArrayList<Manager> manager = new ArrayList<Manager>();        cook.add(new Cook("张三","后厨001"));        cook.add(new Cook("李四","后厨002"));        cook.add(new Cook("王五","后厨003"));        waiter.add(new Waiter("翠花","服务员001"));        waiter.add(new Waiter("酸菜","服务员002"));        manager.add(new Manager("小明","董事会001"));        manager.add(new Manager("小强","董事会002"));        iterator(cook);        iterator(waiter);        iterator(manager);    //参数是一个比较严重的问题,因为要调用work方法,但使用通配符以后就只能是Object类型,还不可以强制类型转换(会出问题)    //所以考虑传递一个Career的子类对象    //泛型的限定:本案例中,父类是固定的,子类是很多很多的。    public static void iterator(ArrayList<? extends Career> array){        //ArrayList<? extends Career>        //泛型限制了父类,成为上限限定,可以传递本类,可以传递子类        Iterator<? extends Career> it = array.iterator();        while(it.hasNext()){            Career career = it.next();            career.work();        }

运行结果

厨师的工作是炒菜。
厨师的工作是炒菜。
厨师的工作是炒菜。
服务员的工作是做一些基础的工作。
服务员的工作是做一些基础的工作。
经理的工作是统筹和管理。
经理的工作是统筹和管理。

0 0
原创粉丝点击