java—泛型编程

这篇具有很好参考价值的文章主要介绍了java—泛型编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是泛型

首先什么是泛型呢?从字面上我们可以理解为广泛的类型,有一定c++基础的程序猿们应该了解,java中的泛型其实就是c++的模板但是使用起来比模板更加简单,那么没有c++基础的呢也没关系,其实泛型它在我们未来的编程中是经常使用的,我们在未来中呢其实并不知道某个方法或者属性应该用一个什么类型,比如说我要你实现一个类这个类里面要有个数组这个数组可以存储任何类型的变量,你应该怎么存储呢?

为什么需要泛型

正如上面所说我们在实际开发的时候很多时候都无法确定我们需要的类型是什么,这时候就需要使用到泛型了。那么泛型究竟应该如何使用呢?我们按照上面的列子来进行阐述

泛型的使用

class MyClass<T>{
    public int a;
    public T  b;
    public MyClass(int p,T b){
        a=p;
        this.b=b;
    }
}
public class Main {
    public static void main(String[] args) {
        MyClass<Integer>m1=new MyClass<>(10,1);
        MyClass<Integer >m2=new MyClass<>(10,2);
        MyClass<String>m3=new MyClass<>(10,"hello");
    }
}

那么看一下上面的代码我们逐步来进行解析,首先就是泛型的使用格式是

class ClassName<T>{

}

这个T也可以是E或者M任意字符都可以甚至可以是多个字符,这个T就是未来我们要实列化初的类型那么泛型类在实例化对象的时候该怎么实例化呢?

ClassName c<Integer>=new ClassName<>();

那么<>括号括起来的其实就是我们这个T要实例化出的对象名称了。那么有了这些基础我们来写一下上面提出的那个问题那就是写一个类,类中包含一个数组这个数组可以存储任意类型的数据。

class MyArrar<T>{
    public Object[] object;
    public MyArrar(int n){
        object=new Object[n];
    }
}

那么上面这个类就是我们实现的可以存储任意类型的数组了那么有些同学可能会有疑惑那这个跟T也没有任何的关系啊说这里用的是Object而不是T,其实这跟编译器运是有关系的我们也可以用T但是用T的话后面会面临很多的问题,因此我们跟源码保持一致就用Object。然后呢构造方法就是为了实列化出我们需要多大的数组空间。然后我们来写一下插入方法。
代码如下

class MyArrar<T>{
    public Object[] object;
    public MyArrar(int n){
        object=new Object[n];
    }
    public void add(int pos,T value){
        object[pos]=value;
    }
}

为什么这里直接用一个等于就可以插入成功了呢?因为泛型有个前提条件就是,泛型必须得是一个类,因此我们讲过Objec是所有类的父类因此,这里可以直接进行等于号。
那么现在我又提出一个要求那就是找到这个数组中的最大值该怎么寻找呢?那么这时候就引出我们下一个知识点叫做泛型的上界。

泛型的上界

什么是泛型的上界呢?上界大家其实就可以理解为上行界限我们通过代码来进行描述

class Myclass2<T extends Integer>{
    
}

其实就是这样在模板后面加上一个extends再加上一个固定的类型即可那么这个表示什么意思呢?其实就是表示这个模板的类型T只能是Integer这个类型或者是继承了这个类型的派生类这个就是泛型的上界,那么回到我们最初的那个问题中,我们应该怎么去找到这个数组中的最大值呢?其实很简单我们既然想找到数组中的最大值也就是说这个类型必须得是可以比较的类型,那么既然可以比较也就是说必须实现了compareTo这个方法,并且我们在写的时候必须指明这个类是comparable(可比较的)。代码如下

class MyArrar<T extends Comparable<T>>{
    public Object[] object;
    public MyArrar(int n){
        object=new Object[n];
    }
    public void add(int pos,T value){
        object[pos]=value;
    }
    public T findMax(){
        T max=(T)object[0];
        for(int i=0;i<object.length;i++){
            if(compareTo(max,object[i])==-1){
                max=(T)object[i];
            }
        }
        return max;
    }
    public int compareTo(T max,Object object){
        return max.compareTo((T)object);
    }
}

那么这里的方法调用顺序是什么样子的呢如下图
java—泛型编程,java,java,开发语言

泛型方法的使用

引出泛型方法

这里给大家出一个问题那就是大家想想有没有这样一个方法就是它可以找到任何数组中的最大值。请记住是任何数组。
那么该怎么去实现这个方法呢?其实就是用泛型方法。那个格式如下

public<T,E,f....> T method_Name(){

}

那么上面那个问题该如何实现呢?我们把这个方法单独放入一个类中来实验一下吧。

class Mytest2{
    public<T extends Comparable<T>> T findMax(T[] arg){//这里由于我们要找到一个——
    //最大值因此我们传入的泛型中必须满足可以进行比较的。
        T max=arg[0];
        for(int i=0;i<arg.length;i++){
            if(max.compareTo(arg[i])==-1){
                max=arg[i];
            }
        }
        return max;
    }
}

泛型是如何编译的

擦除机制

这里要将一下擦除机制,泛型的编译时怎么进行的呢?就是擦除机制在编译过程中JVM通过你传入的类型从而将每个T进行一个擦除替代,那么写道这里想必大家也明白了其实为什么我们写一个***extends Comparable <T>***那么这个T就可以使用comapreTo方法了因为这个代码其实就是告诉编译器我这里这个T肯定是实现了comparaTo的。是可以进行比较的。文章来源地址https://www.toymoban.com/news/detail-833588.html

到了这里,关于java—泛型编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 玄子Share-自然语言编程(NLP)_Java开发小白向 ChatGPT 提问的最佳模板

    以下内容均为 ChatGPT 回答 玄子: 我向你提问时,问题描述精确的重要性 ChatGPT 3.5 问题描述的精确性非常重要,因为它可以让回答者更好地理解您的问题,并且更容易提供准确和有用的解决方案。如果问题描述不够清晰或不够详细,回答者可能会误解您的问题或者理解不到位

    2023年04月09日
    浏览(50)
  • 泛型编程 学习笔记

    它可以不用Print类型(参数); 直接用就能直接推导,从另一种形式来讲,模板是更高级的重载 但是,在类中就不适用,不能自动推导,在C++17开始才能自动推导,以上代码才不会报错 为什么12行Print会报错呢,因为Print没有参数可以推导T的类型,所以必须显示的指定类型,例如

    2024年02月11日
    浏览(45)
  • GO - 泛型编程

    泛型即开发过程中编写适用于所有类型的模板,只有在具体使用的时候才能确定其真正的类型 。随着Go 1.18版本的发布,泛型正式成为了Go语言的一部分。 在编写代码时,我们经常会遇到需要处理不同类型的数据的情况。传统上,我们需要为每种类型编写不同的函数或数据结

    2024年04月11日
    浏览(37)
  • C++ 泛型编程:函数模板

    当需要编写通用的代码以处理不同类型的数据时,C++ 中的函数模板是一个很有用的工具。函数模板允许我们编写一个通用的函数定义,可以用于多种不同的数据类型,从而提高代码的重用性和灵活性。 泛型编程 是一种编程范式,旨在实现可重用、通用性高的代码。它允许我

    2024年02月12日
    浏览(42)
  • 【C++】泛型编程——模板进阶

    在之前的文章里,我们进行了模板初阶的学习( 【C++】泛型编程——模板初阶),了解了什么是泛型编程,学习了函数模板和类模板。 那这篇文章,我们继续学习模板进阶的内容的学习。 首先我们来回顾一下: 我们在模板初阶的学习中,定义模板参数是怎么定义的? 是不

    2024年02月16日
    浏览(37)
  • C++泛型编程之模板

    目录 一、什么是泛型编程  二、函数模板 2.1函数模板的概念 2.2函数模板格式 2.3函数模板的原理  2.5函数模板的实例化 2.6模板参数的匹配原则 三、类模板 3.1类模板的定义格式 3.2 类模板的实例化 四、非类型模板参数 五、模板的特化 5.1模板特化的概念: 5.2函数模板特化 5

    2024年02月07日
    浏览(42)
  • 模拟计算器编程教程,中文编程开发语言工具编程实例

    模拟计算器编程教程,中文编程开发语言工具编程实例 中文编程系统化教程,不需英语基础。学习链接 ​​​​​​https://edu.csdn.net/course/detail/39036 课程安排:初级1 1  初级概述 2  熟悉构件取值赋值 3 折叠式菜单滑动面板编程 4 自定义图形窗口自定义标题栏编程 5 多行文本

    2024年02月08日
    浏览(67)
  • 中文编程开发语言工具构件说明:屏幕截取构件的编程操作

    屏幕截取 用于截取指定区域的图像。 图    标: 构件类型:不可视 重要属性 l        截取类型 枚举型,设置在截取屏幕时的截取类型。包括:全屏幕、指定区域、活动窗口三种。当全屏幕截取时相当于执行了硬拷屏(PrintScreenSysRq键)功能;指定区域截取则是通过矩形

    2024年02月07日
    浏览(57)
  • C++——模板初阶与泛型编程

    🌸作者简介: 花想云 ,在读本科生一枚,致力于 C/C++、Linux 学习。 🌸 本文收录于 C++系列 ,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造全套 C++ 学习教程,持续更新! 🌸 相关专栏推荐: C语言初阶系列 、 C语言进阶系列 、 数据结构与算法 本章我们

    2023年04月17日
    浏览(38)
  • 【C++】——模板(泛型编程+函数模板+类模板)

    之前我们学习了函数重载,让我们在写相似函数的时候非常方便,但函数重载还有很多不足的地方,比如,每次写相似函数的时候,都要我们重新重载一个逻辑、代码几乎一样的函数,这就导致了我们的效率变低,所以我们今天来学习C++模板的相关知识点,学习完模板之后,

    2024年02月05日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包