Java泛型笔记


泛型

1.引出泛型

需求:

​ 在ArrayList中添加3个Dog对象 dog对象含有name和age 使用get方法输出name和age

2.编写一个狗类

package com.hui;

public class Dog {
    private String name;
    public int age;


    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 Dog() {
    }

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

3.编写一个猫类

package com.hui;

public class Cat {
    private String name;
    public int age;


    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 Cat() {
    }

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

4.使用传统方法

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

        ArrayList arrayList = new ArrayList();
        //添加三个狗类
        arrayList.add(new Dog("dahuang", 22));
        arrayList.add(new Dog("huazi", 21));
        arrayList.add(new Dog("wolong", 33));
        
        //不小心添加一个猫类
        arrayList.add(new Cat("maomi",76));

        //遍历
        for (Object o : arrayList) {
            //向下转型
            Dog dog = (Dog) o;
            System.out.println(dog.getName());
            System.out.println(dog.getAge());
        }
    }
}

5.程序运行结果

image-20220909112812156

6.得出传统方法的问题

  • 1.不能对加入集合中的数据进行约束(不安全)
  • 2.遍历的时候需要进行类型转换,影响效率

7.使用泛型解决前面的问题

@SuppressWarnings("all")
public class Generic02 {
    public static void main(String[] args) {

        //使用泛型 表示存放到集合中的元素为Dog类型
        ArrayList<Dog> arrayList = new ArrayList<Dog>();
        arrayList.add(new Dog("dahuang", 22));
        arrayList.add(new Dog("huazi", 21));
        arrayList.add(new Dog("wolong", 33));

        //对数据类型进行约束,编译器报错
        //arrayList.add(new Cat("maomi",76));

        //遍历的时候直接取出Dog类型不是Object类型 不用进行类型转换
        for (Dog dog : arrayList) {
            System.out.println(dog.getName()+"--"+dog.getAge());
        }
    }
}

8.泛型的好处

  • 编译时检查元素的类型,提高了安全性
  • 减少了类型转换次数,提高了程序的效率

9.泛型的介绍

泛型就是可以表示数据类型的一种数据类型

在类声明或实例化时候只要指定具体的类型即可

  ArrayList<Dog> arrayList = new ArrayList<Dog>();

指定类型不会出现类型转换异常的发生

10.泛型的作用

可以在类声明的时候通过一个标识表示类中某个属性的类型

//该数据类型在定义Person对象的时候指定,在编译期间,就确定E是什么
class Person<E>{
    
    // E表示s的数据类型
    E s;
    
    // E也可以是参数类型
    public Person(E s) {
        this.s = s;
    }
    
    // E也可以是返回类型
    public E f(){
        return s;
    }
}

11.泛型的语法

在类名后边指定类型参数的值(类型)

        ArrayList<String> strings = new ArrayList<String>();

给泛型指定数据类型时,要求是引用数据类型,不能是基本数据类型。

   		 ArrayList<int> int = new ArrayList<int>();     //报错

在给泛型指定具体类型后,可以传入该类型或其子类型

不写泛型默认是Object类型

泛型使用形式:

  ArrayList<String> strings = new ArrayList<这里可以省略不写>();

12.自定义泛型

基本语法:

class 类名<T,R…>{

// …表示可以有多个泛型

​ 成员

}

静态方法不能使用泛型:

​ 静态是和类相关的,在类加载时,对象还没创建出来,所以如果静态方法和静态属性使用了泛型,JVM就不知道是什么类型,无法完成初始化。

泛型方法:

​ 可以使用类声明的泛型,也可以使用自己声明的泛型

13.泛型的继承和通配符

泛型不具备继承性

支持任意泛型类型

<? extends AA> AA表示上限 可以接受AA或AA的子类

<? super AA> 支持AA类以及AA类的父类

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/288546.html

(0)
上一篇 2022年9月10日
下一篇 2022年9月10日

相关推荐

发表回复

登录后才能评论