集合类库——泛型机制的学习

泛型的概念

  • 集合中是可以存放不同类型的对象,这是因为将所有对象都看做Object类型放入,因此从集合中取出元素时也是Object类型,需要强制类型转换,
    而强制类型转换可能会引发类型转换异常
  • 泛型机制,也就是在集合名称的右侧使用<数据类型>的方式来明确要求该集合中可以存放的元素类型,若放入其它类型的元素则编译报错
  • 泛型只在编译时期有效,在运行时期不区分是什么类型

泛型就是在集合类型的右侧加上<数据类型>,就只能存放选择的数据类型了

编程使用

泛型不需要强制转换了

//1.准备一个支持泛型机制的List集合。明确要求集合中的要求是String类型
        List<String> lt1 = new LinkedList<String>();
        //2.向集合中添加元素并打印
        lt1.add("one");
        System.out.println("lt1="+lt1);//[one]
        //3.获取集合中的元素并打印
        String s = lt1.get(0);
        System.out.println("获取到的元素是:"+s);//one

在这里插入图片描述
注意菱形特性
后面尖括号中的数据类型可以省略

//菱形特性
        List<Double> lt3 = new LinkedList<>();

笔试考点

相互不能复制

//笔试考点
        //试图讲lt1的数值赋值给lt3,也就是覆盖lt3中原来的数值
        lt3 = lt1;//编译报错 集合中支持的类型不同

泛型机制的底层原理

泛型的本质就是参数化类型,让数据类型作为参数传递,其中E相当于形式参数负责占位,而使用集合时<>中的数据类型相当于实际参数,用于给形式参数E进行初始化,从而使得集合中所有的E被实际参数替换

自定义泛型接口和泛型类

  • 泛型接口和普通接口的区别就是后面添加了类型参数列表,可以有多个类型参数,如:<E, T, … >
  • 泛型类和普通类的区别就是类名后面添加了类型参数列表,可以有多个类型参数,如:<E, T, … >等

自定义泛型类Person

其中T相当于形式参数,负责占位,具体数值由实参决定
T看作是名字为T的数据类型即可

public class Person<T> {
    
    //这里的T是形式参数,负责在这里占个位置
    private String name;
    private  int age;
    private T gender;//这里表名gender是T类型的,取决于我们一会使用Person或new Person对象时来指定

    public Person() {
    
    
    }

    public Person(String name, int age, T gender) {
    
    
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    public T getGender() {
    
    
        return gender;
    }

    public void setGender(T gender) {
    
    
        this.gender = gender;
    }

    @Override
    public String toString() {
    
    
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                '}';
    }
}

泛型类的使用

集合中不支持基本数据类型

public class PersonTest {
    
    
    public static void main(String[] args) {
    
    
        //声明Peron类型的引用指向Person类型对象
        //不指定类型,按Object类型对待
        Person p1 = new Person("zhangfei",30,"male");
        //打印对象特征
        System.out.println(p1);
        System.out.println("--------------------");
        //在创建对象的同时指定数据类型,用于给T进行初始化
        Person<String> p2 = new Person<>();
        p2.setGender("female");
        System.out.println(p2); //null 0 female

        System.out.println("--------------------");
        //使用boolean作为性别类型
        Person<Boolean> p3 = new Person<>();
        p3.setGender(true);
        System.out.println(p3); //null 0 true
    }
}

在这里插入图片描述
实例化泛型类时应该指定具体的数据类型,并且是引用数据类型而不是基本数据类型

泛型类被继承时子类如何处理

Guess you like

Origin blog.csdn.net/Maybe_do_it/article/details/121391801