黑马学习笔记--泛型

来源:互联网 发布:索多玛120天 知乎 编辑:程序博客网 时间:2024/06/11 12:30

泛型

泛型定义与使用

  • A:泛型用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数传递。
  • B:泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型
    ArrayList<String> al=new ArrayList<String>();//ArrayList<String>看作数据类型
  • C:泛型的定义:定义泛型可以在类中预支地使用未知的类型。
  //在ArrayList类的add()方法的源码中定义的E e,使用了epublic boolean add(E e) {        ensureCapacityInternal(size + 1);           elementData[size++] = e;        return true;    }
  • D:泛型的使用:一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
 ArrayList al=new ArrayList(); al.add(“abc”); al.add(1);//由于在定义集合时没有指定泛型,add()方法的形参为Object类型,所以可以往集合中添加任意任意类型的数据(多态特点)

泛型类

格式:

当创建该类的对象的时候,传入类型,此时类上的泛型被确定

class  类名<E,T,……>{//<>中的泛型可以写无数个  //E,T……能够做为类型在该类内部被使用}

案例代码:

/* * 在该类中定义一个成员变量,使用泛型 * * 不指定其数据类型,是一个不确定的数据类型. * 创建不同的对象时,指定不同的数据类型 * */public class MyClass4Type<T> {    private T myField;    public T getMyField() {        return myField;    }    public void setMyField(T myField) {        this.myField = myField;    }}
/* * 泛型类: *      在类中使用泛型 * * 定义:类名后<变量>  如:class A<E> {使用E完全类的定义} * 使用:创建对象时确定类型 * * 一般定义泛型使用E,T,V,K * * 泛型方法: * 定义:方法返回值前<变量> 如:public <T> void method(){使用T} * 使用:调用方法时确定类型 */public class Demo01type_class {    public static void main(String[] args) {        //测试使用自己定义的泛型类        MyClass4Type<String> mc4t = new MyClass4Type<String>();        //调用了使用类泛型的方法        mc4t.setMyField("Jack");        String myField = mc4t.getMyField();        System.out.println(myField);        //创建对象时指定泛型为Integer则所有使用了泛型的方法根据对象类型一起改变        MyClass4Type<Integer> mc4t2 = new MyClass4Type<Integer>();        mc4t2.setMyField(12);        System.out.println(mc4t2.getMyField());    }}

泛型方法

格式

在调用泛型方法,并且传入实参的时候才能确定方法上形参的类型

修饰符 <T,Q,E……> 返回值类型 方法名(T t,Q q,……){//方法上的泛型定义在返回值的前面}

案例代码

/* * 在该类中定义一个成员变量,使用泛型 * * 不指定其数据类型,是一个不确定的数据类型. * 创建不同的对象时,指定不同的数据类型 * */public class MyClass4Type<T> {    //定义泛型方法    public <T2> void method(T2 t) {        System.out.println(t);    }}/* * 泛型类: *      在类中使用泛型 * * 定义:类名后<变量>  如:class A<E> {使用E完全类的定义} * 使用:创建对象时确定类型 * * 一般定义泛型使用E,T,V,K * * 泛型方法: * 定义:方法返回值前<变量> 如:public <T> void method(){使用T} * 使用:调用方法时确定类型 */public class Demo01type_class {    public static void main(String[] args) {        //测试使用自己定义的泛型类        MyClass4Type<String> mc4t = new MyClass4Type<String>();        //调用泛型方法,是在调用方法时确定的数据类型        mc4t.method("abc");        mc4t.method(12);    }}

泛型接口

格式一:

interface 接口名<Q,E,R……>{public abstract void method(T t);//假设定义一个方法}class 类名 implements 接口<实际类型>{      @Override         public void method(String t) {            System.out.println(t);}}

格式二:

interface 接口名<Q,E,R……>{         public abstract void method(T t);//假设定义一个方法}public class MyClass24Inter<T> implements MyInter4Type<T>{    //由于没有指定接口中具体的数据类型,所以方法中仍然使用这种不确定的数据类型    @Override    public void method(T t) {    }}

泛型通配符

泛型通配符:?定义:(查看ArrayList的构造方法)无法在类中使用使用:调用方法时可以给予任意类型。参照Arraylist的构造方法? extends E代表只要是E类型的子类即可? super E代表只要是E类型的父类即可
import java.util.ArrayList;/* * 泛型通配符?,代表任意的数据类型 * * 定义:(查看ArrayList的构造方法)无法在类中使用 * * 使用:调用方法时可以给予任意类型。参照Arraylist的构造方法 * public ArrayList(Collection<? extends E> c) * 为了便于?的理解,我们将以上方法重写为public ArrayList(ArrayList<? extends E> c) * * 该方法的意思:创建集合对象A时,给于另外一个集合对象B作为参数,则创建好的集合A中包含了集合B中的元素 * * ? extends E代表只要是E类型的子类即可 * ? super E代表只要是E类型的父类即可 */public class Demo01 {    public static void main(String[] args) {        //定义集合b,包含3个元素        ArrayList<String> listB = new ArrayList<String>();        listB.add("Jack");        listB.add("Rose");        listB.add("Trump");        //使用集合b创建集合a        ArrayList<Object> listA = new ArrayList<Object>(listB);        listA.add("Obama");        //观察集合A        System.out.println(listA);    }}

泛型优点:

  • 提高程序的安全性
  • 将运行期问题转移到了编译期
  • 省去了类型强转的麻烦
0 0