JDK的泛型如何工作的

416 阅读3分钟

这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战

JDK 1.5中出现了泛化的类型的概念:

  --泛型:表示泛化的类型

 泛化--泛指一些后面加上类型;我们开始使用--  

实例:

我们开始使用的瓶子,但是生产厂家却不知道他们的用处是什么,比如我想要啤酒瓶,

 厂家生产的瓶子--缺少一个具体的标签是对比与商品的,不确定里面装的是什么东西,容器里面存储的东西,但是东西却不知道具体是什么

2.联系到JAVAJDK的集合类型,我们可以建立很多的集合,但是具体使用的集合里面存的数据五花八门的--统一的object,但是具体的八种类型却不得而知

image.png

我们从上述直接可以看出来,数据是直接可以遍历出来,但是要得到具体的属性

  object-->String -->字符串的长度;

通过一个特定的标识-表示容器中存在数据的类型----泛型

泛型分为类型形参和类型实参

形参和实参-----是对于具体的数据标志和传输的值来确定的;

2.泛型的好处

首先,我们可以建立泛型之后,避免类型转化问题,其次确定类型之后,别的类型进入不了容器中;

 安全:只有符合类型的数据才能进入容器中; 避免类型转化:

image.png

3.泛型的实现方式

(1)泛型接口、泛型类


  public  interface<E>  接口名 
public interface Collection<E>

image.png


import org.junit.Before;
import org.junit.Test;

/**
 * @author lucas
 * @time 2021/8/15/17:02
 * @description
 **/
public class Test1 {
    @Test
    public void   test4234(){
        //语文老师
        Studentdb<Integer> china =new Studentdb<>();
        china.name="玛丽";
        china.score=66;
        System.out.println("学生名字"+china.name);
        System.out.println("学生的成绩"+china.score+"test3424");
    }
    @Before
    public void   test011111(){
        //语文老师
       Studentdb<String> china =new Studentdb<>();
       china.name="玛丽";
       china.score="优秀";
       System.out.println("学生名字"+china.name);
       System.out.println("学生的成绩"+china.score+"test111");
    }
    @Test
    public void   test02(){
        //语文老师
        Studentdb<Character> china =new Studentdb<>();
        china.name="玛丽";
        china.score='A';
        System.out.println("学生名字"+china.name);
        System.out.println("学生的成绩"+china.score+"test02");
    }
    @Before
    public void   test04(){
        //语文老师
        Studentdb<Character> china =new Studentdb<>();
        china.name="玛丽";
        china.score='A';
        System.out.println("学生名字"+china.name);
        System.out.println("学生的成绩"+china.score+"test04");
    }

    /**
     *  鉴于不同的老师会给学生不一样的类型分数-我们可以采用泛型类的方式
     *  进行数据统一标准,然后直接实现
     * @param <T>
     */
    //泛型一般放在名字之后
  class Studentdb<T>{
     private    String  name;
     private  T  score;


    }

    interface  db<E>{
      int size();
      int age();
    }
}

可以输出不同的数据来证明class--有点策略模式的东西;

当在同一个类别中,一个属性的类型重复变化导致数据的类型变化

----我们可以将这种来使用我们策略模式来表示

   好处:

   (1)便于管理,安全性,只有合格的数据才能进入

   (2)避免类型转化和强引用的

image.png

最普通的,我们集合类的父接口--collection--是一个抽象的接口;

  这就是最标准的一个  public interface Collection

如何成为一个使用泛型接口

   class  teacher extends  Studentdb<String>{
      //继承泛型的类。实现泛型的接口
        //    public abstract class AbstractCollection<E> implements Collection<E>
    }

注意事项:

泛型的实参是一个引用的数据类型和简单的-

                Map<String,Object> dataMap=new HashMap();

泛型类适用的范围:

(1)适用于返回值,参数,局部变量等;

(2)不能使用在静态的方法或者是属性中(static中);

表示数据中的

我们可以指定T 的类型,加上具体的范围,比如数字,(整数,小数)

  class Studentdb<T extends Number>{
     private    String  name;
     private  T  score;
    }

image.png

如果没有按照泛型形参给予--,我们就建立泛型,默认是object;

image.png

image.png

卢卡总结

泛型,表示标准的接口中或者参数传递中的标准,

既然是标准那就是多种情况,多种形式都可以用到的;

public class  Result<T>{

//code
private  integer  code;

//消息
 private String message;

//数据
 T data; 

}

上述是一个基本的标准返回类