2020-09-07

1.泛型

1.1泛型概述【理解】(视频01)

1.什么是泛型(泛型概述)

​ 泛型就是参数化类型,也可称为类型参数。格式为:<类型>.(ArrayList)

2.为什么要使用泛型(泛型的好处)

  1. 它提供了编译时类型安全检测机制,把运行时期的问题提前到了编译期间
  2. 避免了强制类型转换
package com.itheima.genericitysummarize;

import java.util.ArrayList;
import java.util.Iterator;

/**
 *  不写泛型的弊端
 */
public class GenericitySummarize {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add(123);

        Iterator it = list.iterator();
        while(it.hasNext()){
            String next = (String) it.next();
            int len = next.length();
            System.out.println(len);

        }
    }
}

1.2泛型类的使用【应用】(视频02)

1.泛型用在什么地方(泛型可以使用的地方)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F2iYzUxz-1599473380859)(img/1596093650953.png)]

2.什么是泛型类(ArrayList)

如果一个类的后面有 ,表示这个类是一个泛型类

3.如何使用泛型类

创建泛型类对象时,必须要给这个泛型确定具体的数据类型

1.3 泛型-自定义泛型类(应用)(视频03)

1.如何定义泛型(泛型的定义格式)

  1. <类型>: 指定一种类型的格式.

    ​ 尖括号里面可以任意书写,一般只写一个字母.

    ​ 例如:

  2. <类型1,类型2…>: 指定多种类型的格式,多种类型之间用逗号隔开.

    ​ 例如: <E,T> <K,V><Q,M>

泛型字母总结:

​ E:元素(Element),多用于java集合框架

​ K:关键字(Key)

​ N:数字(Number)

​ T:类型(Type)

​ V:值(Value)

2.如何定义泛型类(泛型类格式)

​ 定义格式

修饰符 class 类名<类型> {  }

​ 范例:

​ public class Generic {},此处的T可以推荐使用常见的T,E,K,V等形式参数来表示泛型

示例代码

package com.itheima.genericityclass;

//就是一个泛型类
public class Box<E> {
    private E element;

    public E getElement() {
        return element;
    }

    public void setElement(E element) {
        this.element = element;
    }
}

测试类

package com.itheima.genericityclass;

/**
 * 自定义泛型类
 */
public class MyGenericityClass {
    public static void main(String[] args) {
        Box<String> box1 = new Box<>();
        box1.setElement("给小丽的土味情话");

        String element1 = box1.getElement();
        System.out.println(element1);


        Box<Integer> box2 = new Box<>();
        box2.setElement(19);

        Integer element2 = box2.getElement();
        System.out.println(element2);

    }
}

1.3泛型-泛型方法的使用【应用】(视频04)

1.什么是泛型方法(前置知识)

​ 方法声明中有泛型的方法,就是一个泛型方法

  1. 泛型方法的格式
public <T> T[] toArray​(T[] a){}
参数类型 
T - 数组的运行时类型
参数 
a - 要存储列表的元素的数组,如果它足够大; 否则,为此目的分配相同运行时类型的新数组。 
结果 
一个包含列表元素的数组

测试类

package com.itheima.genericitymethod;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * 使用Java中的泛型方法
 */

public class GenericityMethod1 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("给小花同学的土味情话");
        list.add("给小丽同学的土味情话");
        list.add("给小路同学的土味情话");
        //将list集合转成一个数组并返回
        //如果是空参的,那么返回的数组类型为Object类型的.
        Object[] objects = list.toArray();
        System.out.println(Arrays.toString(objects));

        String[] strings = list.toArray(new String[list.size()]);
        System.out.println(Arrays.toString(strings));

    }
}

1.4 自定义泛型方法(视频05)

1.定义格式

修饰符 <类型> 返回值类型 方法名(类型 变量名) {  }

​ 范例: public void show(){}

示例代码:

package com.itheima.genericitymethod;

import java.util.ArrayList;

/**
 * 自定义泛型方法
 * 定义一个泛型方法,传递一个集合和四个元素,将元素添加到集合中并返回
 */
public class GenericityMethod2 {
    public static void main(String[] args) {
        ArrayList<String> list1 = addElement(new ArrayList<String>(), "a", "b", "c", "d");
        System.out.println(list1);

        ArrayList<Integer> list2 = addElement(new ArrayList<Integer>(), 1, 2, 3, 4);
        System.out.println(list2);
    }

    public static <T> ArrayList<T> addElement(ArrayList<T> list , T t1 ,T t2 ,T t3 ,T t4){
        list.add(t1);
        list.add(t2);
        list.add(t3);
        list.add(t4);
        return list;
    }
}

1.5泛型接口【应用】(视频06)

  • 定义格式

    修饰符 interface 接口名<类型> {  }
    
  • 示例代码

    package com.itheima.genericityinterface;
    
    public class GenericityInterface {
        public static void main(String[] args) {
            GenericityImpl1<String> genericity = new GenericityImpl1<>();
            genericity.method("小丽给我的土味情话");
    
            GenericityImpl2 genericityImpl2 = new GenericityImpl2();
          genericityImpl2.method(19);
        }
    }
    
    
    interface Genericity<E>{
        public abstract void method(E e);
    }
    
    class GenericityImpl2 implements  Genericity<Integer>{
    
      @Override
        public void method(Integer integer) {
          System.out.println(integer);
        }
    }
    
    
    
    class GenericityImpl1<E> implements Genericity<E>{
    
        @Override
        public void method(E e) {
            System.out.println(e);
      }
    }
    

1.5类型通配符(视频07)(直接使用父类)

1.类型通配符的格式

<?>

2.泛型通配符的使用

1.类型通配符: <?>

  • ArrayList<?>: 表示元素类型未知的ArrayList,它的元素可以匹配任何的类型,但是并不能把元素添加到ArrayList中了,获取出来的也是父类类型

2.类型通配符下限: <? extends 类型>

  • ArrayList <? extends Number>: 它表示的类型是Number或者其子类型

3.类型通配符上限: <? super 类型>

  • ArrayListList <? super Number>: 它表示的类型是Number或者其父类型
public class Genericbobing{
    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();
        ArrayList<Number> list3 = new ArrayList<>();
        ArrayList<Object> list4 = new ArrayList<>();
		printList(list1);
        printList(list2);
        
        method1(list1);
        method1(list2);
      	method1(list3);
        method1(list4);

        method2(list1);
        method2(list2);
      	method3(list3);
        method4(list4);
    }
  
    // 泛型通配符: 此时的泛型?,可以是任意类型
    public static void printList(ArrayList<?> list){}
    // 泛型的上限: 此时的泛型?,必须是Number类型或者Number类型的子类
    public static void method1(ArrayList<? extends Number> list){}
    // 泛型的下限: 此时的泛型?,必须是Number类型或者Number类型的父类
    public static void method2(ArrayList<? super Number> list){}
}

小结

1.为什么要使用泛型

使用泛型的目的就是为了类型安全,将类型问题从运行时提到编译时进行处理

2.什么是泛型

它提供了编译时类型安全检测机制

3.怎么使用?

在创建声明或创建时给泛型类型指定具体的类型

4.用在哪里?

泛型类、泛型方法、泛型接口

5.泛型通配符

? 、? extends 父类或接口 (下限) ? super 父类或接口 (上限)

6.多态遇到泛型会怎么样?(扩展不需要讲)

ArrayList alist= ArrayList 对象?

ArrayList alist=List对象?

List llist= ArrayList 对象?

List llist=ArrayList 对象?

public static print(ArrayList list) 是可否可以传ArrayList对象?