跟王老师学泛型(一)使用泛型

使用泛型

主讲教师:王少华 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

来自为知笔记(Wiz)

时间: 2024-10-22 23:36:33

跟王老师学泛型(一)使用泛型的相关文章

跟王老师学泛型(八):泛型擦除与转换

泛型擦除与转换 主讲教师:王少华 QQ群:483773664 学习目标: 掌握泛型擦除的含义 理解泛型转换的规则 一.泛型擦除 (一)什么泛型擦除 Java中的泛型基本上都是在编译器这个层次来实现的.在生成的Java字节码中是不包含泛型中的类型信息的.也就是说虚拟机中没有泛型,只有普通类和普通方法 使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉.这个过程就称为类型擦除. 类型擦除的主要过程如下:     1.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换.     2.移除所有

跟王老师学注解(二)注解的分类及内建注解

跟王老师学注解(二):注解的分类及内建注解 主讲教师:王少华   QQ群号:483773664 一.注解的分类 在Java中,根据注解的使用方法和用途,可将注解分成3类,分别是 内建注解(也称为基本注解),定义于java.lang包下 元注解(Meta Annotation) 自定义注解 二.内建注解 (一)分类 在JDK5.0及以上的版本的java.lang包下提供了3种标准的注解类型,分别是 @Override: @Deprecated @SuppressWarnings (二)@Overr

跟王老师学MySQL:MySQL数据类型之小数类型

跟王老师学MySQL:MySQL数据类型之小数类型 主讲教师:王少华   QQ群号:483773664 学习内容 小数类型有哪些以及它们的取值范围 定义语法中的M和D的含义 定点型和浮点型的区别 一.简介 MySQL中使用浮点数类型和定点数类型来表示小数. 浮点数类型包括单精度浮点数(FLOAT型)和双精度浮点数(DOUBLE型). 定点数类型就是DECIMAL型. 二.字节数.取值范围 三.定义语法 1 类据类型 (M,D) M:精度,数据的总长度 D:标度,小数点后的长度 注: 小数点不占长

跟王老师学MySQL:MySQL数据类型之字符类型

跟王老师学MySQL:MySQL数据类型之字符类型 主讲教师:王少华   QQ群号:483773664 学习内容: 字符串类型的种类及其特点 char和varchar的异同 字符串类型是在数据库中存储字符串的数据类型. 字符串类型包括 CHAR. VARCHAR BLOB TEXT 一.char和varchar (一)定义语法 1 字符串类型 (M) 注: 字符串类型:char或varchar M:指定了该字符串最大长度 (二)二者不同之处 char类型长度是固定的,即在创建表时就指定了,其长度

跟王老师学MySQL:MySQL数据类型之日期与时间类型

跟王老师学MySQL:MySQL数据类型之日期与时间类型 主讲教师:王少华   QQ群号:483773664 学习内容 YEAR类型的特点及使用 TIME类型的特点及使用 DATE类型的特点及使用 DATETIME类型的特点及使用 TIMESTAMP类型的特点及使用 MySQL表示日期和时间的数据类型有以下几种: 1.YEAR类型 2.TIME类型 3.DATE类型 4.DATETIME类型 5.TIMESTAMP类型 一.Year类型 (一)简介 year使用一个字符串来表示年份 MySQL中

跟王老师学MySQL:MySQL数据类型常见问题及解答

跟王老师学MySQL:MySQL数据类型常见问题及解答 主讲教师:王少华   QQ群号:483773664 学习内容 整数类型和浮点类型的异同 浮点数类型和定点数类型的异同 char和varchar类型的异同 时间和日期类型的异同 text和blob的异同 存储路径字符串的注意事项 mysql如何存储boolean类型 null的处理 在MySQL中创建表时,需要考虑为字段选择哪种数据类型是最合适的.选择了合适的数据类型,会提高数据库的效率. 一.整数类型和浮点类型 整数类型和浮点类型最大区别是

跟王老师学MySQL:MySQL数据类型之整数类型

跟王老师学MySQL:MySQL数据类型之整数类型 主讲教师:王少华   QQ群号:483773664 MySQL的数据类型包括整数类型.浮点数类型.定点数类型.日期和时间类型.字符串类型和二进制数据类型. 学习目标 整型包括哪些类型以及它们的取值范围 以tinyint为例,讲解了定义整型的三个属性 一.简介 整数类型是数据库中最基本的数据类型. 标准SQL中支持INTEGER和SMALLINT这两类整数类型. MySQL数据库除了支持这两种类型以外,还扩展支持了TINYINT.MEDIUMIN

跟王老师学Java三大特性(一):案例 QuickHit:需求分析

项目案例:QuickHit:需求分析 主讲教师:王少华   QQ群号:483773664 学习目标 学会用面向对象思想来进行需求分析 一.需求 根据输入速率和正确率将玩家分为不同级别 级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高 规定时间内完成规定次数的输入,正确率达到规定要求,则升级 玩家最高级别为6级.初始级别一律为1级 用户错误输入一次,游戏结束 二.面向对象分析 (一) 发现类 玩家(Player)类 游戏(Game)类 级别(Level)类 (二)发现类的属性 1.玩家

跟王老师学MySQL: 基本查询语句

跟王老师学MySQL: 基本查询语句 主讲教师:王少华   QQ群号:483773664 学习内容 查询语句的基本语法 查询数据指从数据库中获取所需要的数据.MySQL中是使用SELECT语句来查询数据的 一.select的基本语法形式如下 1 2 3 4 5 SELECT  属性列表  FROM  表名 [ WHERE  条件表达式1 ] [ GROUP BY  属性名1  [ HAVING 条件表达式2 ] ] [ ORDER BY  属性名2  [ ASC | DESC ] ] 属性列表:

跟王老师学MySQL:单表查询

跟王老师学MySQL:单表查询 主讲教师:王少华   QQ群号:483773664 学习内容 查询所有字段 查询指定字段 查询指定记录 带in关键字的查询 带between and关键字的查询 带like关键字的查询 查询空值 带and的多条件查询 带or的多条件查询 查询不重复记录 对查询结果进行排序 单表查询是指从一张表中查询所需要的数据.查询数据时,可以从一张表中查询数据,也可以从多张表中同时查询数据.两者的查询方式上有一定的区别.因为单表查询只在一张表上进行操作,所以查询比较简单. 一.