【Java】泛型

使用百度翻译API遇到的sign问题 今天写一个python爬虫来调用百度翻译api的时候,发现百度翻译的formdata里面多了一个sign参数,这个参数是根据翻译的内容而在前台生成的,如果发送的请求中,query内容和sign不匹配,则收到的响应是error。 在网上查看解决方法时,找到了这么一条办法,就是下载了计算sign的js源代码,然后使用python的PyExecJS来调用js函数,动态生成sign。 参考链接: htt... 阅读详情

重要声明:本文章仅仅代表了作者个人对此观点的理解和表述。读者请查阅时持自己的意见进行讨论。

本文更新不及时,请到原地址查看原文。
原地址:【Java】泛型。

一、泛型简介

泛型听名知意,它是和Java中数据类型有点关系的东西,它本什么并不是某个类型。为了更好的使用它,必须弄明白它具体的设计理念。不妨做一个生活中的比喻来解释这样的设计理念:

  1. 果盘
    我们家里大厅茶几上基本上都会有一个果盘,每当来客人的时候,我们就会将各种水果放在果盘里。因为它是果盘,我们将水果放在里面这很正常,我们总不会把臭袜子放在里面,对吧!

  2. 钱包
    大多数情况下,我们钱包都是拿来装钱的,只要是个人,一看到钱包,就肯定想到它里面应该有钱。总不会把家庭作业塞钱包里嘛。

  3. 茶杯
    喝茶是常用的就是茶杯,茶杯里装的是茶水。虽然你可以把今晚炖的龙骨汤倒进去喝,但谁没事儿闲着会干这样的事情嘛,对吧!

可见泛型在生活中处处可见,它的出现就是为了让我们知道某一个东西是用来处理某类事物的,这就是泛型。我们在编写程序的时候常常出现一个工具方法返回了一个对象,但我们设计之初的时候此方法可能返回多种不同类型,而在泛型出现之前,我们就必须小心又小心去处理这些不同的类型。现在有了泛型,在我们编写代码的时候就完成了对返回类型直观说明,这就极大的避免了许多可能出现的隐藏bug。官方说法就是: Generics add stability to your code by making more of your bugs detectable at compile time. 翻译成中文(百度翻译)就是:泛型通过在编译时检测更多的错误来增加代码的稳定性。

二、代码说明

果盘,假设我们是用ArrayList来当果盘,在泛型出现以前,我们的果盘是这样的:

ArrayList fruits = new ArrayList();
fruits.add("苹果");
fruits.add("桃子");

String fr = (String)fruits.get(0);

很明显,我们虽然有了果盘,但是我们不知道果盘里到底是不是水果,我们只有在拿到一个水果之后试图将其强制认为是一个水果。如果代码穿插很多,代码量大,不知道这个位置拿到的是不是真的水鬼,这样强制处理难免会在某一个时刻出现错误。

庆幸现在我们有了泛型,有了泛型就相当于告诉了程序,我们的果盘里只能装水果,别的你不能装,这不就保证了获取的数据就一定是水果了嘛:

ArrayList<String> fruits = new ArrayList<>();
fruits.add("苹果");
fruits.add("桃子");

String fr = fruits.get(0);

通过在定义果盘的时候指定果盘能处理的数据类型<String>来指定我们的果盘只能容纳String类型的水果,当我们再次进行获取操作时,甚至都不需要再强制转换,受泛型限定,我们获取到的一定就是水果,不可能是其他的。

三、自己写支持泛型的类

上面我们提到的ArrayList是Java内置已经实现好了支持泛型用法。那么我们自己要写一个能够使用泛型技术的类又该如何实现呢。

现在不如我们来实现一个钱包,这个钱包你想要它装钱,它就只能装钱你想让它装别的也可以,满满的代码里都是注释,绝对看到高潮:

// Wallet.java

// 普通类定义名称后面,多写一个尖括号,里面写这个类要处理的数据的类型,
// 当然了,这个类型只是一个类型替代符号,那么在这个类里面的所有要用到这个类型
// 的地方,都使用这个符号就可以了。
// 如果有多个,你可以通过英文逗号分隔开。
// 现在我们就用大写字母T表示我们这个钱包支持一个数据类型,这个类型具体是什么类型,
// 在其它地方使用钱包时只需要指定其类型就可以了。
public class Wallet<T> {

    // 定义一个数组,放入的钱都在这个数组里面。这里就当我们的钱包只能放10张钱,
    // 为什么要定义成Object类型的数组?
    // 因为 Object 是所有类型的超类,而且我们这里的T是不能直接通过它进行 new T[10] 这样是错误的。
    private Object[] ts = new Object[10];


    // 通过put方法允许外界将钱放入钱包。
    // 而放入的参数类型,就正好使用我们类上面写的 T,
    // 这样一来,钱包被定义成放什么类型,就只能往put方法里
    // 传递什么类型的参数。
    public void put(T t) {

        // 内部实现就简单了,循环找一个空位子把钱放进去。
        for (int i = 0; i < ts.length; i++) {
            if (ts[i] == null) {
                ts[i] = t;
                return;
            }
        }

        // 如果运行到这里,肯定钱包被装满了。不管了。
    }


    // 从钱包里取出一张钱,可以看到方法返回类型被定义为了 T,
    // 这样一来就保证了别的地方使用这个方法的时候,返回值就
    // 直接使希望的类型,不用再进行强制转换了。
    public T get() {

        // 内部实现就简单的从数组后面往前面找,发现一张钱就立即返回。
        for (int i = ts.length - 1; i >= 0; i--) {
            if (ts[i] != null) {

                // 这里我们将返回类型强制转换为了我们定义的 T 类型,
                // 因为我们数组定义的时候是定义为了 Object 的,
                // 而put 方法保证了每次放入的一定是相同的 T 类型,
                // 所以我们取出的时候,将其强制转换为 T 类型是不会出问题的。
                return (T)ts[i];
            }
        }

        // 如果运行到这里,说明钱包里没有钱,直接返回null。
        return null;
    }

}

现在,不防试一试我们自己的钱包类Wallet:


public class Test {

    // 钱。
    static class Money {
        private int num;

        public Money(int num) {
            this.num = num;
        }
    }


    public static void main(String[] args) {

        // 创建一个钱包,并且只允许这个钱包防止 Money 类型的数据。
        Wallet<Money> wallet = new Wallet<>();

        // 放入2张钱。
        wallet.put(new Money(10));
        wallet.put(new Money(50));

        // 获取一张钱
        // 获取的这张钱都不用强制转换,就可以直接使用。
        // 通过泛型,这样就进一步减少了可能出现的程序错误。
        // 并且代码更加简洁清晰。
        Money money = wallet.get();
    }
}

四、类型限定

在我们声明泛型时,加入我们希望这个类型只能是某个类以及这个类的子类的类型,这时候我们可以这样来声明我们的类:


// 限定 类型 T 只能是 Money 类以及其子类。
class Wallet<T extends Money> {
    // ...
}

五、泛型方法

如果我们类上没有指定类型,仅在方法上也是可以写泛型方法的:


// 方法 make 定义个了一个类型 A ,并且方法返回参数被设定为 A
// 这样的方法可以被任何类型引用接收,将会自动将返回值转换为引用的类型
// (实际上就是里面某处进行了转换到A指定的处理)。
// 如果返回的值不能被转换为对应的引用类型,将会爆转换异常错误。
// 这种写法了解就好。
public static <A> A make() {
    return (A)new Money(100);
}

举例使用这个方法:

public static void main(String[] args) {
    Object o = make(); // Object 是所有类的超类,转换为 Object 没有问题。
    Money m = make(); // 我们方法里面返回的就是Money,这里用Money接收没问题。

    Test t = make(); // 编译时没有问题,当运行时就会出现转换错误,我们不能把返回的Money转为Test类型噻。
}
【泛型】Java中的泛型,泛型类,泛型接口,泛型方法,泛型擦除 这篇文章总结一下Java中的泛型相关知识点,包括:泛型概念、泛型优缺点、泛型通配符、泛型上下界、泛型使用(泛型类、泛型接口、泛型方法)、泛型擦除等内容。 一、泛型概念 (1)什么是泛型 什么是泛型??? 泛型(Generic),是一种参数化数据类型,它允许我们在编写程序代码的时候不用具体指定需要什么数据类型,而是等到具体使用的时候,将数据类型以参数的形式传递给程序,这就是泛型程序设计。 (2)为什么需要泛型 我们来看看下面这个栗子 假设现在有个需求,通过集合保存元素,需要保存String字 阅读详情

相关推荐

k8s架构、工作流程、集群组件详解

Kubernetes(简称K8s,是因为 k 和 s 之间有八个字符)是一个开源的容器编排平台,用于管理云平台中多个主机上的容器化应用程序。它提供了一种机制,用于自动化部署、扩展和管理容器化应用程序的集群。Kubernetes的目标是让部署容器化应用程序变得简单高效。它提供了应用程序部署、规划、更新和维护的基本机制,同时具备强大的扩展性和可靠性。Kubernetes采用主从设备模型(Master-Slave架构),其中Master节点负责核心的调度、管理和运维任务,而Slave节点负责运行应用程序的容器。

qq_51545656的博客 4382

Java之泛型

一、什么是泛型 1.背景: JAVA推出泛型以前,程序员可以构建一个元素类型为Object的集合,该集合能够存储任意的数据类型对象,而在使用该集合的过程中,需要程序员明确知道存储每个元素的数据类型,否则很容易引发ClassCastException异常。 2.概念: Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全监测机制,该机制允许我们在编译时检测到非法的类型数据结构。泛型的本质就是参数化类型,也就是所操作的数据类型被指定为一个参数。 3.好处: 类型安全 消

Beyondczn的博客 9373

JetLinks社区版VS企业版:手把手教你用PostgreSQL+Redis搭建物联网中台(Win7实测)

本文详细对比了JetLinks社区版与企业版的核心差异,并提供了在Windows 7系统上,使用PostgreSQL和Redis搭建物联网中台的完整部署教程。文章深入解析了从环境准备、后端服务构建到前端部署的每一步,为开发者在资源有限环境下构建高性价比物联网平台提供了清晰的实战指南。

w1x2y3的博客 305

Java泛型详解:Java泛型集合、泛型类、泛型方法、泛型的使用

在 Java 1.5 之前没有泛型,通常需要使用强制类型转换的方式将一种数据类型转换为另一种数据类型,这种转换要求开发者对实际参数的类型具有可预知性。对于强制类型转换错误的情况,编译器可能不会提示错误,但是在运行时会出现异常,这是一个安全隐患。 为了解决这一隐患,从 Java 1.5 开始提供了泛型。泛型可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。本节将详...

jijiangpeng的博客 7443

SWIPT技术(无线通信携能技术)的简介与架构——(后续补充无人机SWIPT方向)

SWIPT一、SWIPT(无线通信携能)技术简介1.1、组成:1.2、与传统无线通信的区别:1.3、SWIPT 的集成接收器架构设计1、单独的接收器2、TS架构——时间开关(Time switching,TS)3、PS架构——功率分流(Power splitting,PS)4、天线开关接收器主要两种架构的区别参考文献SWIPT的发展 一、SWIPT(无线通信携能)技术简介 SWIPT(Simultaneous Wireless Information and Power Transfer )是各种WPT技术

Blue 1万+

深入解析LVDS电平标准在LCD屏接口设计中的关键作用

本文深入解析了LVDS电平标准在LCD屏接口设计中的核心作用。文章不仅阐释了LVDS低电压差分信号的工作原理、关键电气参数及抗噪优势,还详细对比了VESA与JEIDA两种主流数据格式,并提供了从PCB布局布线到信号调试的实战避坑指南,是确保高速、稳定显示的关键技术参考。

weixin_28419039的博客 334

Java泛型——为何要有泛型

对于String类类型来说,它是继承自Object的,而Integer的直接父类是Number,因此会有Integer无法转String的错误。泛型类是在实例化类的时候指明泛型的具体类型,那么泛型方法就是在调用方法时指明泛型的具体类型。在实现传入泛型实参的泛型接口的实现类定义中,实现类即使不声明泛型,也不会编译错误。在实现未传入泛型实参的泛型接口的实现类定义中,实现类要声明泛型,否则会编译错误。为了避免这样可能的错误,引入泛型,使编译器在编译阶段就提示不匹配的类类型。方法返回了一个更加特定的返回类型。

xiaovie的博客 1730

EMQX 结合MySQL实现精细化ACL权限管理实战

本文详细介绍了如何通过EMQX结合MySQL实现精细化的ACL权限管理,提升物联网设备接入和消息传输的安全性。内容包括环境准备、基础配置、权限规则设计技巧以及高级应用与性能优化方案,帮助开发者快速掌握动态生效、便于管理的权限控制方法。

weixin_28683689的博客 197

java泛型——泛型类、泛型方法、泛型接口

泛型Java 泛型Java 泛型是什么泛型类泛型类的格式泛型类举例泛型方法泛型方法的格式泛型方法举例泛型接口泛型接口的格式泛型接口举例 Java 泛型 Java 泛型是什么 官方定义: 泛型是Java SE 1.5的新特性,泛型的本质就是参数化类型,也就是说所操作的数据类型被指定为一个参数 这种参数类型可以用在类、接口和方法的创建中,分别成为泛型类、泛型接口、泛型方法 优缺点: ​ 优点:可以不用再类型转换了 ​ 缺点:降低了代码的可读性 泛型类 泛型类:当一个类要操作的引用数据类型不确定的时候,可

一个小小的码农 6596

OBS技术深度剖析:从开源直播工具到专业制作引擎的进化之路

本文深入剖析了开源直播软件OBS的技术架构与发展历程。从2012年诞生至今,OBS已成长为直播领域的事实标准,其成功源于模块化设计和开源协作模式。文章详细解析了OBS的核心技术:1) 分层架构与插件系统,2) GPU加速的渲染管线,3) 智能音频处理,4) 多平台编码优化。同时探讨了虚拟摄像头、浏览器源等高级功能的实现原理,并提供了性能优化方案和硬件配置建议。随着AI、WebRTC等新技术发展,OBS将持续引领实时内容创作工具的创新,为开发者和创作者提供更强大的技术支持。

程序猿老樊的博客 326

AI 编程组合之deepseek+vscode+cline插件,使用deepseek大模型实现代码自动生成

本文介绍了VSCODE下cline插件的安装结合DeepSeek-V3,ai编程的组合套件,举了两个例子一个是生成登录页面,一个是生成贪吃蛇游戏

技术博客 7万+

Java泛型

是同时存在的,可是如果是常规的两个方法,他们的方法签名是一样的,也就是说虚拟机根本不能分别这两个方法。如果是我们自己编写Java代码,这样的代码是无法通过编译器的检查的,但是虚拟机却是允许这样做的,因为虚拟机通过参数类型和返回类型来确定一个方法,所以编译器为了实现泛型的多态允许自己做这个看起来“不合法”的事情,然后交给虚拟器去区别。如果是重载,那么子类中两个setValue方法,一个是参数Object类型,一个是Date类型,可是我们发现,根本就没有这样的一个子类继承自父类的Object类型参数的方法。

YLXCA的博客 1316

智能座舱-语音交互系统

从什么是智能座舱、智能座舱的发展驱动因素、智能座舱的构成要素三个方面梳理我对智能座舱的基础认识之后,为了加深“智能座舱产品入门”课程中语音交互部分知识的理解,我从什么是语音交互、语音交互的底层技术、智能座舱的语音交互等方面,对智能座舱语音交互系统相关的知识进行了梳理与总结。

GUOSA0928的博客 1442

【 java 泛型】详解java泛型

java泛型可以提高java程序的类型安全,提高程序的可靠性,并且在开发中也较常用,因此还是要简单学习一下!

阿牛的博客 2069

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java之泛型,什么是泛型?为什么用泛型?(泛型详解)

1.为什么会有泛型呢? 早期的Object类型可以接受任意的对象类型,但是在实际使用中,会有类型转化的问题,存在隐患,所以Java提供泛型解决这个安全问题 2.什么是泛型? 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类...

围巢 3994

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java泛型的其他应用——泛型接口、泛型方法、泛型数组以及泛型的嵌套设置

学习目标 掌握泛型接口的使用 掌握泛型方法的定义的及使用 掌握泛型数组的使用 掌握泛型的嵌套设置 之前所有的操作都是在类中直接使用泛型操作的,那么,对于Java来说,也可以直接在接口中定义及使用泛型。 定义泛型接口 在JDK1.5之后,不仅仅可以声明泛型类,也可以声明泛型接口,声明泛型接口和声明泛型类的语法类似,也是在接口名称后面加上,如下格式所示: [访问权限]

1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java 泛型详解(普通泛型、 通配符、 泛型接口,泛型数组,泛型方法

Java代码Java代码Java代码Java代码Java代码Java代码Java代码。

2401_84619530的博客 1531

Java 泛型

Java 泛型 Java 泛型(generics)是 JDK 5 中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。泛型信息不会进入到运行时阶段。编译器有效 泛型的三种方式:泛型类、泛型接口、泛型方法 泛型类 定义格式: 修饰符 class 类名<代表泛型的变量> { } 例如,API中的ArrayList集合: class ArrayList<E>{ p

JustToFaith 2955

java泛型

文章目录1. 泛型简述2. 泛型类别2.1 泛型类2.1.1 某种实际类型,重用性不好,Holder只能拥有A类型2.1.2 Object类型,类型太泛,可以容纳所有类型2.1.3 在创建的时候可以指定只可以容纳某种类型,此后只能容纳这种类型注意:基础类型无法作为类型参数,其封装类型可以2.2 泛型接口2.3 泛型方法3. 泛型擦除3.1 泛型只在编译期有效3.2 泛型内部无法获得泛型参数的有关信...

登峰小蚁 3065

Java【泛型】

Java的泛型说明

在下的博客 1468

java 泛型的默认值_java泛型

1.什么是泛型泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。泛型:泛型类 泛型接口 泛型方法作用:提高程序健壮性,简化代码泛型的默认值是Objectjdk 要1.5以上2.泛型定义/***泛型类*首先定义一个person的实体类 Person其中A代表的就是一个泛型,调用时可以自定义数据类型*/package com.temp;public class Per...

weixin_34246474的博客 1833

java中的泛型是什么_Java中泛型是什么?Java泛型的详细介绍

本篇文章给大家带来的内容是关于Java中泛型是什么?Java泛型的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。一、什么是泛型?Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常.泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型参数化类型:ArrayList中的E称为类型参数变量Arra...

weixin_29174013的博客 3474

【Java】关于Java泛型,为你做最全面的泛型介绍

泛型(Generics)是Java语言中的一个重要特性,它提供了类型安全和代码重用的机制。泛型起到的作用包括类型安全、代码重用、程序设计抽象、集合框架的增强、减少强制类型转换。在面向对象编程和设计模式中有广泛的应用。

✈ 正在努力 の 寒江(StudiousTiger) ✌ 呐 ✈ 1071

【Java】泛型深入

在刚刚,我们仅仅是使用泛型,那我能不能自己写一个类似于ArrayList带有泛型的类让别人去用呢,当然这必须是可以的。泛型可以写在类的后面,也可以写在方法上,还可以写在接口后。如果将泛型写在类的后面,那么这个类叫做泛型类在类名后面定义泛型,创建该类对象的时候,确定类型如果将泛型写在方法的后面,那么这个类叫做泛型方法在修饰符后面定义方法,调用该方法的时候,确定类型如果将泛型写在接口的后面,那么这个类叫做泛型接口在接口名后面定义泛型,有两种用法:① 实现类确定类型;② 实现类延续泛型。

qq_39921135的博客 1074
上一篇: 【微信公众号开发】八、微信JS发起支付
下一篇: 【node】sequelize数据库ORM框架使用教程
Microanswer
博客等级 码龄10年 38粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值