zoukankan      html  css  js  c++  java
  • 泛型概念及其特性

    1.泛型是JDK1.5引入的新特性,也是最重要的一个特性
    2.泛型可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的
    3.泛型的原理就是“类型的参数化”,即把类型看做参数。也就是说把所要操作的数据类型
    看做参数,就像方法的形式参数是运行时传递的值的占位符一样。

    4.简单的说,类型变量扮演的角色就如同一个参数,它提供给编译器用来类型检查的信息
    5.泛型可以提高代码的扩展性和重用性

    6.泛型的作用及其引出: 如果我们需要产生多个对象,每个对象的逻辑完全相同,知识对象内的成员变量的
    类型不同,那么我们如何去做? 方法1,创建多个类文件,给每个类终端成员变量设置指定的数据类型
    ,但这种方式会导致类的膨胀,重用性太差 方法2,创建一个类文件,给这个类总的成员变量设置Object
    型的数据类型, 这种方法虽然编译的时候正常,但运行的时候可能会产生异常(类型转换错误),如何解决
    以上2个问题————使用泛型类,可以很好的解决以上2个问题

    7.所以泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型,泛型编程时一种编程范式,
    它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用

    8. 实例-泛型类
    public class GenClass <T> { //T代表了一个数据类型
    // 当使用了这个类来创建对象时,要传递一个数据类型作为参数,比如int类型,String类型,
    //这个参数就可以在类里面的任意地方被使用

    T可以认为是代表一个变量名,用来接收这个类构造对象时传递过来的数据类型

    private T obj; //可以作为属性的数据类型

    public GenClass( T job) { //可以作为方法的形参的数据类型
    this.obj = obj;
    }

    public T getObj() { //可以作为方法的返回值类型
    return obj;
    }

    public void setObj(T obj) {
    this.obj = obj;
    }
    }


    9. 泛型类的几个特性:
    (1)泛型的类型参数(也就是<T>)可以是泛型类
    (2)泛型类可以同时设置多个类型参数
    (3)泛型类可以继承泛型类
    (4)泛型类可以实现泛型接口

    10.限制泛型可用类型:
    (1)在定义泛型类别时,默认在实例化泛型类的时候可以使用任何类型,但是如果想要限制使用泛型类型
    时,只能用某个特定类型或者是其子类型才能实例化该类型时,可以在定义类型时,使用extends
    关键字指定这个类型必须是继承某个类,或者实现某个接口

    (2)当没有指定泛型继承的类型或者接口时,默认使用extends Object,所以默认情况下任何类型
    都可以作为参数传入,比如class SuperClass<T1> ,T1之所以可以接收任何类型,是因为
    class SuperClass<T1>等价于 class SuperClass<T1> extends Object

    11.类型通配声明:
    同一泛型类,如果实例化时给定的实际类型不同,则这些实例的类型是不兼容的,不能相互赋值
    如: Generic<Boolean> f1 = new Generic<Boolean>();
    Generic<Integer> f2 = new Generic<Integer>();
    创建了两个不同类型的泛型类对象,如果使用语句f2=f1将f2赋给f1,编译时将发生错误
    Generic<Object> f = f1; //f1和f类型不兼容,发生编译错误
    f = f2; //f2和f类型同样不兼容,也会发生编译错误
    如何解决这个问题?

    12.泛型类实例之间的不兼容性会带来使用的不便,我们可以使用泛型通配符(?)来声明
    泛型类的变量就可以解决这个问题。

    13.泛型通配的方式:
    (1) ?代表任意一个类型
    示例: Generic<Boolean> f1 = new Generic<Boolean>();
    Generic<?> f = f1; //表示,f可以引用任意类型参数的Generic泛型类所构造出来的对象
    (2) 和限制泛型的上限相似,同样可以使用extends关键字限定通配符匹配类型的上限:
    示例: Generic<Dog> f1 = new Generic<Dog>();
    Generic<? extends Animal> f = f1;
    //表示f可以引用Generic泛型类所构造出来的对象,也可以引用Animal的子类对应的Generic泛型类所构造出来的对象

    (3)还可以使用super关键字将通配符匹配类型限定为某个类型及其父类型
    示例: Generic<Animal> f1 = new Generic<Animal>(); //Animal是一个父类
    Generic<? super Dog> f = f1;
    //f可以引用类型参数为Dog的Generic这个泛型类所构造出来的对象,也可以引用类型参数为Dog的父类型的Generic这个泛型类所构造出来的对象

    14.泛型方法使用场合:
    什么时候使用泛型方法而不是泛型类呢 ?
    (1)当添加类型约束只作用于一个方法的多个参数之间、
    而不涉及到类的其他方法时,使用泛型方法
    (2)施加类型约束的方法为静态方法,只能将其定义为泛型方法,因为静态方法不能使用其所在类的类型参数
    例如: class A<T> {
    private T a;
    public static void a() {
    System.out.println(a);
    //这样写就不行了,如果要这样输出,在这个静态方法static关键字前面,增加<T>,也声明为泛型方法
    }
    }

  • 相关阅读:
    课后作业之评价
    课堂作业之寻找水王
    构建之法阅读笔记04
    课下作业
    构建之法阅读笔记03
    学习进度条九
    学习进度条八
    冲刺第五天
    构建之法阅读笔记02
    冲刺第四天
  • 原文地址:https://www.cnblogs.com/enjoyjava/p/6842808.html
Copyright © 2011-2022 走看看