初步了解泛型

目录

泛型的引入

泛型

泛型

泛型类

泛型的上界


泛型的引入

之前学习的数组里面是存放着整型或者自字符串中一种的数组,如果想要在一个数组里面放多种类型数据,我们该怎么去做呢?Object类或许是一个好的解决方法,因为Object类是所有类的父类,这样我们可以通过创建一个Object类的数组类解决这个问题。

java 复制代码
class MyArray{
    public Object[] array = new Object[10];
    //创建一个Object类数组

    public Object getPos(int pos){
        return this.array[pos];
    }
    //返回对应位置的数据

    public void setVal(int pos, Object val){
        this.array[pos] = val;
    }
    //在对应的位置里存放数据
    
}
java 复制代码
public static void main(String[] args) {
    MyArray myArray = new MyArray();
    myArray.setVal(0,10);
    myArray.setVal(1,"hello");
    //String ret = myArray.getPos(1);
    //这里需要强转才能为ret赋值
    String ret = String.valueOf(myArray.getPos(1));
    System.out.println(ret);
}

虽然其中所有类型的数据都可以存放,但不难看出,这样的做法会出现以下不便的情况:

  1. 不同类型的数据需要强转才能输出
  2. 排序不够整齐,需要记录每个位置放着什么类型的数据

泛型

泛型

虽然当前所有类型的数据都可以存放到其中,但我们更却趋向于让数组内放一种类型的数据

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

泛型的语法格式为:

class 泛型类名称<类型形参列表> {

// 这里可以使用类型参数

}

class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {

// 这里可以使用类型参数

}

在了解泛型的语法格式后,我们可以尝试把上面的Object类数组进行改写。

java 复制代码
class MyArray<T>{
    public Object[] array = new Object[10];

    public T getPos(int pos){
        return (T)this.array[pos];
    }

    public void setVal(int pos, T val){
        this.array[pos] = val;
    }
}

public class Test {
    public static void main(String[] args) {
        MyArray<Integer> myArray = new MyArray<>();
        myArray.setVal(0,10);
        myArray.setVal(1,19);
        int ret = myArray.getPos(0);
        System.out.println(ret);
        //myArray.setVal(2,"not");
        //不再成立,自动进行类型检查
    }
        
        //对于不同类型的数据,我们可以采用实例化不同的对象来实现
        MyArray<String> myArray1 = new MyArray<>();
        myArray1.setVal(2, "not");
        String ret1 = myArray1.getPos(2);
        System.out.println(ret1);
        
}

类名后的<T>代表占位符,表示当前类是一个泛型类。

这里我们可以发现,int ret *= myArray.getPos(0);*中不需要进行类型的强制转换,因为输出的一定是整型数据。

泛型类

泛型类的语法格式为:

泛型类<类型实参> 变量名; // 定义一个泛型类引用

new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象

java 复制代码
MyArray<Integer> list = new MyArray<Integer>();

泛型只能接受类,所有的基本数据类型必须使用包装类。

如果编译器可以通过上下文推导出数据类型时,我们可以省略后面的类型书写:

java 复制代码
MyArray<Integer> list = new MyArray<>();

泛型的上界

泛型的上界的语法格式为:

class 泛型类名称<类型形参 extends 类型边界> {

...

}

java 复制代码
public class MyArray {
     ...  
}

只接受 Number 的子类型作为 E 的类型实参

相关推荐
weixin_3831964710 小时前
java基础面试题@Autowired和@Resource区别
java·开发语言
技术小黑10 小时前
RNN算法实战系列06 | LSTM 实现糖尿病探索与预测
rnn·算法·lstm
evans在进步10 小时前
LeetCode 33:搜索旋转排序数组——Java 两阶段二分查找详解
java·python·leetcode
疯狂打码的少年10 小时前
【数据结构】二叉树的性质(五大性质+计算)
数据结构·笔记·算法
言乐610 小时前
Python游戏水平测试辅助系统2
开发语言·windows·python·游戏·django
Web Security Loop10 小时前
MAC卸载JDK环境
java·macos·jdk
我不是疯子是傻子11 小时前
Qt 实时曲线卡顿优化:从QPainter到OpenGL的3级加速实战
开发语言·qt
zlinear数据采集卡11 小时前
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
wabs66611 小时前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版
CIO_Alliance11 小时前
AI认知系列(3)| 数据、算法、算力、场景四要素协同
人工智能·算法·ipaas·系统集成·企业cio联盟·企业级ai化转型