跟王老师学泛型使用泛型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跟王老师学泛型使用泛型相关的知识,希望对你有一定的参考价值。

使用泛型

主讲教师:王少华 QQ群:483773664

学习目标:

  1. 理解使用泛型的必要性

  2. 掌握使用Java泛型


一、为什么使用泛型

Java集合有一个缺点:Java集合会把我们“丢进”集合的元素默认为Object类型,没有记住元素本身的类型。当然,Java这样设计是有原因的:因为设计集合的程序员不会知道我们需要用这个集合来保存什么类型的对象,所以他们把集合设计成能保存任何类型的对易用。

这样设计会存在以下问题

  1. 集合对元素类型没有任何限制,这样可能引发一些问题。比如我们创建一个集合用于存放Person对象,但是程序可以轻易的将Dog对象放入这个集合中。

  2. 因为集合没有记住无素本身的类型,所以在取出这些元素时,要进行强制类型转换。这样就可能发生“类型转换异常(ClassCastException)"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ListErr {
    public static void main(String[] args) {
        //创建一个List,只想用这个List来保存字符串
        List strList = new ArrayList();
        strList.add("孙悟空");
        strList.add("猪八戒");
        //不小心,将Integer类型的数据添加进去了
        strList.add(500);
         
        //遍历取值(strList里取出的值都是Object类型)
        for (Object object : strList) {
            //可进行类型转换
            String name = (String) object;  //进行到最后一个元素的时候,会发生类型转换错误
            System.out.println(name);
        }
    }
}

技术分享

技术分享


总结:要使用泛型(Generic)原因

  1. 解决元素存储的安全性问题

  2. 解决获取数据元素时,需要类型强制转换问题

二、手动实现类型检查

(一)、代码实现及验证

如果我们想要一个List对象,只能存放String对象,那么我们要对ArrayList进行扩展。代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class StrList {
    private List strList = new ArrayList();
    /**
     * 重写添加元素方法
     * @param str
     * @return
     */
    public boolean add(String str){
        return strList.add(str);
    }
    /**
     * 重写get方法
     * @param index
     * @return
     */
    public String get(int index) {
        return (String) strList.get(index);
    }
     
    public int size(){
        return strList.size();
    }
}

使用上面的List

技术分享

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class TestStrList {
    public static void main(String[] args) {
        //创建一个只想保存字符串的List集合
        StrList strList = new StrList();
        strList.add("孙悟空");
        strList.add("猪八戒");
        //将其他类型添加进去,就是编译不通过
        //strList.add(500);
        for (int i=0;i<strList.size();i++) {
            //无须强制类型转换
            String name = strList.get(i);
        }
    }
}

(二)、问题来了

上面的方法虽然已经很好的解决了Java集合原先存在的二个缺点,但如果将这种实现方式应用到实际项目开发中,是一件很恐怖的事情。因为我们要定义很多List子类。Java工程师肯定不会这么傻,那么Java又是如何解决这些问题的呢?

三、使用泛型

(一)使用泛形

从JDK1.5以后,Java允许我们在创建集合时指定集合元素的类型。Java的参数化类型被称为泛型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class GenericList {
    public static void main(String[] args) {
        //创建一个只想保存字符串的List集合
        List<String> strList = new ArrayList<String>();
        strList.add("孙悟空");
        strList.add("猪八戒");
        //将其他类型添加进去,就是编译不通过
        //strList.add(500);
        //无须强制类型换
        for (String string : strList) {
            System.out.println(string);
        }
    }
}

(二)对象实例化时不指定泛型,默认为Object

1
2
3
4
5
6
7
8
public class GenericTest {
    public static void main(String[] args) {
        List list = new ArrayList();
        for (Object object : list) {
             
        }
    }
}

(三)泛型不同的引用不能相互赋值

技术分享

(四)使用泛形时,泛形类型须为引用类型,不能是基本数据类型

技术分享


四、学习视频网址:

http://edu.51cto.com/course/course_id-6083.html






以上是关于跟王老师学泛型使用泛型的主要内容,如果未能解决你的问题,请参考以下文章

跟王老师学泛型:定义泛型接口及实现

跟王老师学泛型: 自定义带泛型声明的方法

跟王老师学泛型:类型通配符

跟王老师学泛型:限制通配符

跟王老师学泛型:Java自动装箱与拆箱

跟王老师学泛型:泛型的应用