关于泛型的知识

一.什么是泛型

1.泛型的基本定义

泛型:就是适用于许多许多类型

**泛型的主要目的:**就是指定当前的容器,要持有什么类型的对象,让编译器去检查,此时,就要把类型作为参数传递,需要什么类型,就传入什么类型。

2.语法

关于泛型的知识_第1张图片
定义泛型类,在类型名称后要在 <> 中说明参数列表,也可以定义多个参数

关于泛型的知识_第2张图片
泛型类可以继承另一个类

3.举例

实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个
下标的值?
思路:

  1. 我们以前学过的数组,只能存放指定类型的元素,例如:int[] array = new int[10]; String[] strs = new
    String[10];
  2. 所有类的父类,默认为Object类。数组是否可以创建为Object?
class MyArray<T>{
    //创建一个Object数组
    private Object[] objects=new Object[10];
    //设置一个存储数据的方法(T的作用就是存放指定类型的数据)
    public void setArray(int pos,T val){
        objects[pos]=val;
    }
    //设置一个获取数据的方法,(需要强转为指定类型的数据)
    public T getArray(int pos){
        return (T)objects[pos];
    }
}

public class Test {
    public static void main(String[] args) {
        //传递的类型就是在我们编译的时候对数据类型进行检查
        //取数据不需要进行类型转换
        //<>中不能是简单类型,必须是包装类型或者引用类型
        MyArray<Integer> myArray=new MyArray<>();
        myArray.setArray(0,1);
        myArray.setArray(1,1);
        System.out.println(myArray.getArray(0));
        System.out.println("=====================");
        MyArray<String> myArray1=new MyArray<>();
        myArray1.setArray(0,"hello");
        String str=myArray1.getArray(0);
        System.out.println(str);
    }
}

我们可以看到,我们不仅可以传值,还可以传数据类型,不过传递的数据类型必须是包装类型或者是引用数据类型

  1. 类名后的 代表占位符,表示当前类是一个泛型类
  2. 不能new泛型类型的数组
  3. 类型后加入<指定包装类型>指定当前类型
  4. 不需要进行强制类型转换
  5. 规范】类型形参一般使用一个大写字母表示,常用的名称有:
    E 表示 Element
    K 表示 Key
    V 表示 Value
    N 表示 Number
    T 表示 Type
    S, U, V 等等 - 第二、第三、第四个类型

二.泛型是如何编译的

在编译的过程当中,将所有的T替换为Object这种机制,我们称为:擦除机制

Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息。

三.泛型的上界

1.什么是泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

关于泛型的知识_第3张图片

关于泛型的知识_第4张图片

2.复杂示例

关于泛型的知识_第5张图片
关于泛型的知识_第6张图片

因为Alg这个泛型类实现了Comparable接口,所以传入的数据类型也要实现这个接口,因为Integer实现了Comparable接口但是Person并没有实现这个接口所以不能将Person作为类型传递,如果想传递,必须要实现Comparable接口
关于泛型的知识_第7张图片
如图Person实现了Comparable接口所以就不会报错。

四.泛型方法

关于泛型的知识_第8张图片

你可能感兴趣的:(java,android,开发语言)