3.泛型

泛型

泛型的好处:

统一数据类型;
把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来;

泛型的细节:

java中的泛型是伪泛型,添加后,其内部依旧是按Object类型进行处理的;
泛型中不能写基本数据类型;
指定泛型的具体数据类型后,传递数据时,可以传入该类类型或者其子类类型;
如果不写泛型,类型默认是Object;

泛型的定义:

分类:
  • 泛型类:

    • 概念:定义在类后面的泛型称为泛型类;

    • 使用场景:当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类;

    • 格式:此处E可以理解为变量,是用来记录数据的类型的,可以写成其他英文字符(最常见为:T、E、K、V);

      修饰符 class 类名<类型>{						public class ArrayList<E>{
      	修饰符 返回值类型 方法名(类型 变量名){		  	public E add(E e){ 	
      	}										  }
      }											}
      
  • 泛型方法:

    • 概念:方法中形参类型不确定时;

    • 格式:此处T可以理解为变量,是用来记录数据的类型的,可以写成其他英文字符(最常见为:T、E、K、V);

      ​ 如有多个修饰符,则把类型写在最后一个修饰符后面;

修饰符<类型> 返回值类型 方法名(类型 变量名){	public<T> void show(T t){	public<E> void show(ArrayList<E> list){
}										}							}
  • 泛型接口:

    • 使用方式:

      方式1: 实现类给出具体类型;	写法: public class MyArrayList2 implements List<String>{},String可以换别的类型;
      方式2: 实现类延续泛型, 创建对象时再确定; 写法: public class MyArrayList3<E> implements List<E>{}
      
    • 格式:

      修饰符 interface 接口名<类型>{						public interface List<E>{
      }												 }
      

泛型的继承性和通配符:

继承性: 泛型不具备继承性,但是数据具备继承性:
1.可以再一个指定泛型的集合中添加该泛型的子类数据(数据具备继承性);
2.有一个形参是有指定泛型集合的的方法,该方法只能接收与形参一致的指定泛型集合,不能是该泛型的子类(泛型不具备继承性);

例子:

package com.caihongjia.a03mygenerics;

import java.util.ArrayList;

public class GenericsDemo5 {
    public static void main(String[] args) {
        //泛型不具备继承性,但是数据具备继承性

        ArrayList<Ye> list1 = new ArrayList<>();
        ArrayList<Fu> list2 = new ArrayList<>();
        ArrayList<Zi> list3 = new ArrayList<>();

        //泛型不具备继承性
        method(list1);
//        method(list2); 报错
//        method(list3); 报错

        // 数据具备继承性
        list1.add(new Ye());
        list1.add(new Fu());
        list1.add(new Zi());
    }
    public static void method(ArrayList<Ye> list) {
    }
}
class Ye { }
class Fu extends Ye { }
class Zi extends Fu { }
通配符:
  • 分类:
1. ?:表示不确定的类型,与E等字符一个作用;
2. ? extends E :	表示可以传递E或者E所有的子类类型;
3. ? super E : 表示可以传递E或者E所有的父类类型;
  • 作用:

    可以用来限定类型的范围
    
  • 例子:

    //                                可以使用Ye类型及其子类
    public static void method(ArrayList<? extends Ye> list) {
    }
    //                                可以使用Ye类型及其父类
    public static void method2(ArrayList<? super Ye> list) {
    }
    //                                可以使用任意类型
    public static void method3(ArrayList<?> list) {
    }
    

综合练习:

  • 要求:

  • 实现:

package com.caihongjia.a04test;

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

public class Test1 {
    public static void main(String[] args) {

        ArrayList<PersianCat> list1 = new ArrayList<>();
        ArrayList<LiHuaCat> list2 = new ArrayList<>();
        ArrayList<Teddy> list3 = new ArrayList<>();
        ArrayList<SiberianHusky> list4 = new ArrayList<>();
    }
/*

    该方法能养所有品种的猫,但是不能养狗
    public static void keepPet(ArrayList<? extends Cat> list){
        for (Cat cat : list) {
            cat.eat();
        }
    }

    该方法能养所有品种的狗,但是不能养猫
    public static void keepPet(ArrayList<? extends Dog> list){
        for (Dog dog : list) {
            dog.eat();
        }
    }

    该方法能养所有的动物,但是不能传递其他类型
    public static void keepPet(ArrayList<? extends Animal> list){
        for (Animal animal : list) {
            animal.eat();
        }
    }

 */
}
posted @ 2023-09-24 15:49  回家太晚太悲催  阅读(72)  评论(0)    收藏  举报