java基础:浅谈泛型

2023-11-16

1.为什么要使用泛型

给一段代码:

import java.util.ArrayList;
import java.util.List;

public class GenericList {
    //error
    public static void main(String[]args){
        List strList=new ArrayList<>();
        strList.add("str1");
        strList.add("str2");
        strList.add(10);
        strList.forEach(str->System.out.println(((String)str).length()));
    }


}

运行结果:在这里创建了一个List集合,并且希望在内部状态String值,但是,由于误操作而装载了Integer对象,所以程序会进行报错。

说明:在Java的集合中,有一个缺点,把一个对象放入集合中后,集合就会“忘记”这个对象的数据类型,当再次取出对象时,该对象的编译类型就变成了Object型。同时,在取出集合元素的时候还需要进行强制的类型转换,增加了编程的复杂度。

 

2.使用了泛型后:

import java.util.ArrayList;
import java.util.List;

public class GenericList {
    //error
    public static void main(String[]args){
        
        List strList=new ArrayList<String>();
        strList.add("str1");
        strList.add("str2");
        strList.add(10);
        strList.forEach(str->System.out.println(((String)str).length()));
    }


}

优点:

1.指定strList中只能放置String类型(List<String>)

2.无需进行参数类型转换,因为集合会“记住”保存在其中的类型为String类型

 

3.Java7泛型的“菱形”语法

在java7以前,如果使用带泛型的接口,调用构造器创建对象时构造器的后面也必须带上泛型。

  List<String> strList=new ArrayList<String>();

但是在java7之后,构造器后只需要给出一对尖括号即可<>,java可以推断尖括号里应该是什么泛型信息,形象的称为“菱形语法”

   List<String> strList=new ArrayList<>();

4.如何自定义带泛型声明的类?

举个栗子:

import java.util.List;

/**
 * 类型固定
 * */
public class Apple<T> {
    private T info;
    public Apple(){}
    public Apple(T info){
        this.info=info;
    }
    public void setInfo(T info){
        this.info=info;
    }
    public T getInfo(){
        return info;
    }
    public void showInfoDetails(){
        System.out.println(this.info);
    }
    public static void main(String[]args){
        Apple<String> a1=new Apple<>("苹果");
        a1.showInfoDetails();
        Apple<Double>a2=new Apple<>(1.22);
        a2.showInfoDetails();
    }


}

 

使用Apple<T>可以生成多个如Apple<String>,Apple<Double>,..等多个逻辑子类

注:当创建了带泛型声明的接口或者父类后,可以为该接口实现类,但是,父类中不能再去包含形参

//error
public class A extends Apple<T>

//right
public class A extends Apple<String>

注:不管为泛型的类型形参传入哪一种类型实参,对于java而言都被当做一个类去处理,在内存中也只会占用一块空间

List<String>l1=new ArrayList<>();

List<Integer>l2=new ArrayList<>();

System.out.println(l1.getClass()==l2.getClass());
//true
//虽然传入的是不同的泛型实参,但是指向的依旧是同一个空间

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java基础:浅谈泛型 的相关文章

随机推荐

  • 什么是Iot?什么是AIot?

    什么是Iot 什么是AIot 物联网是新一代信息技术的重要组成部分 其英文名称是 The Internet of things 由此 顾名思义 物联网就是物物相连的互联网 这有两层意思 第一 物联网的核心和基础仍然是互联网 是在互联网基础上
  • Tinkercad和LTspice仿真Arduino音频

    电子基础 系统和传感器 电子系统和传感器 数字系统和 ARDUINO 控制 模拟数字转换 采样 MIDI 控制系统 音频传感器 开关 电位器和麦克风 音频执行器 LED 和扬声器 直流电路 欧姆定律和直流电流 基尔霍夫电压定律 串联电路 分
  • C++复习笔记--STL练习案例1(评委打分和员工分组)

    目录 1 评委打分 1 1 案例描述 1 2 代码实现 2 员工分组 2 1 案例分析 2 2 代码实现 1 评委打分 1 1 案例描述 有 A B C D E 共 5 名选手 由 10 个评委分别对每一名选手打分 去除评委的最高分和最低分
  • 7 个适合初学者的项目,可帮助您开始使用 ChatGPT

    推荐 使用 NSDT场景编辑器快速搭建3D应用场景 从自动化日常任务到预测复杂模式 人工智能正在重塑行业并重新定义可能性 当我们站在这场人工智能革命中时 我们必须了解它的潜力并将其整合到我们的日常工作流程中 然而 我知道开始使用这些新技术可
  • 必看!大语言模型调研汇总!!

    作者 guolipa 知乎 自从ChatGPT出现之后 各种大语言模型是彻底被解封了 每天见到的模型都能不重样 几乎分不清这些模型是哪个机构发布的 有什么功能特点 以及这些模型的关系 比如 GPT 3 0 和 GPT 3 5 就有一系列的模
  • Android 统一打包框架(附源码下载)

    唠叨 把手给我 我带你去吃云浮吃石磨肠粉 云吞面 木瓜渣 那里的肠粉和广州的不一样 皮很薄很滑 肉馅没广州的那么花里胡哨 只有肉碎和香葱 但吃起来就很香滑 再配上它的甜辣酱 那味道好极了 云吞面的面是手打的竹升面 就是手动用个大竹子 一下下
  • 做量化你需要知道的那些术语!(持续更新)

    金融相关 股票 股份公司发行的所有权凭证 债券 承诺按一定利率支付利息并按约定条件偿还本金的债权债务凭证 风险较低 固定收益 固定收益类投资指投资于银行定期存款 协议存款 国债 金融债 企业债 可转换债券 债券型基金等固定收益类资产 风险低
  • antd design pro 之「PageHeaderWrapper」

  • 微服务-API网关-权限控制

    权限控制介绍 权限控制是一个古老的话题 你可能会想有没有什么权限设计方案可以满足所有的应用场景呢 答案是没有 就像几乎所有问题一样 没有一种系统可以解决所有情况的 我们需要根据不同的场景和需求来设计不同的系统 权限控制主要设计用户 角色 组
  • CCIE面试题

    前言 这里是几个月前在网上转载很多的CCIE面试题 题虽然不难 但如果没有在电信或cisco代理商工作过 仅仅凭书面的知识还是回答不全的 下面是网上的参考答案加上我的一点点补充 以后有时间再补充 先贴出来供大家参考 也让从事相关技术的人自我
  • YOLOV5更换轻量级的backbone:mobilenetV2

    目录 简洁概要 修改主干网络 一 添加自己主干网络 二 在yolo py中添加common中的两个函数 三 制作mobilenetv2的yaml配置文件 四 制作数据集VOC的yaml配置文件 五 启用训练 六 性能检测 简洁概要 Mobi
  • Elasticsearch 8.8.0 发布

    Elasticsearch 是一个基于 Lucene 库的搜索引擎 它提供了一个分布式 支持多租户的全文搜索引擎 具有 HTTP Web 接口和无模式 JSON 文档 Elasticsearch 基于 Java 开发 并在 SSPL Ela
  • 使用mongo命令工具操作集合数据

    与 MongoDB 建立连接 mongo 如果设置了密码 使用这行命令 mongo port 27017 u admin p xxxxxx authenticationDatabase admin 以操作八月创建的历史数据为例 确认操作集合
  • docker 启动时错误docker: Cannot connect to the Docker daemon

    在学习docker的时候遇到一个错误docker Cannot connect to the Docker daemon at unix var run docker sock Is the docker daemon running 如下
  • make[1]: [persist-settings] Error 2 (ignored) CC adlist.o /bin: cc: command not found make[1]: *

    Linux系统安装Redis执行Make编译时报错 make 1 persist settings Error 2 ignored CC adlist o bin cc command not found make 1 adlist o E
  • 微信小程序 scroll-view的滚动条设置

    小程序的scroll view用的比较多了 列表页一般也没管它的滚动条 最近突然发现在android与ios中横向滑动的时候表现不一样 不一样在哪呢 ios上直接就不显示啊 也是没谁了 深入想了一下 这滚动条能不能换一颜色或者换个样式 有这
  • 基于AIOT技术的智慧校园空调集中管控系统设计与实现

    AIOT技术的智慧校园空调集中管控系统设计与实现本科毕业论文 I 引言 本文旨在探讨基于AIOT技术的智慧校园空调集中管控系统的设计和实现 首先 综述当前AIOT技术发展状况和智慧校园空调集中管控系统在当前应用领域中的重要性 其次 分析相关
  • 原理图符号(原理图库)创建流程及注意事项

    参考资料 电巢EMEA体验营二期 1 原理图符号创建流程 1 0 元器件属性 以一款压力传感器芯片LPS22HH为例 来讲解原理图符号的创建流程 LPS22HH的引脚描述如下所示 1 1 创建工程 1 2 创建原理图符号文件 创建完成原理图
  • Xilinx BUFGMUX使用注意事项

    Xilinx BUFGMUX使用注意事项 最近使用Xilinx FPGA的时候 需要用到一个外部时钟和一个PLL产生的时钟 可以通过外部SWICH进行时钟的切换 觉得这种方式可以通过原语例化完成 原语 果不其然 在原语示例中找到了类似的模块
  • java基础:浅谈泛型

    1 为什么要使用泛型 给一段代码 import java util ArrayList import java util List public class GenericList error public static void main