JDK1.5后增加了泛型,那么为什么要有泛型呢?我们该如何自定义泛型结构呢?

Hadoop生态系统-新手快速入门(含HDFS、HBase系统架构) Hadoop简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。 Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量... 阅读详情

本篇主要讲解java泛型的理解、集合中简单使用泛型、自定义泛型结构(包括类、接口、方法)。


一、什么是泛型?

通俗来讲,可以把泛型理解为带有标签的罐子,罐子贴着红糖的标签,就只能放红糖;罐子贴着白糖的标签,就只能放白糖,不可以乱放。用集合来解释,可以理解为:

list贴上了String的泛型标签,就只能添加String类型的数据;list1贴上了Integer的泛型标签,就只能添加Integer类型的数据;否则就会报错。


二、泛型的概念

  • 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类 型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如, 继承或实现这个接口,用这个类型声明变量、创建对象)确定(即传入实 际的类型参数,也称为类型实参)。
  • 从JDK1.5以后,Java引入了“参数化类型(Parameterized type)”的概念,允许我们在创建集合时再指定集合元素的类型,比如:List<String>,这表明该List只能保存字符串类型的对象。
  • JDK1.5改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持, 从而可以在声明集合变量、创建集合对象时传入类型实参。
  • 简单的看一下List接口中的泛型
public interface List<E> extends Collection<E> {
    Iterator<E> iterator();
    <T> T[] toArray(T[] a);
    boolean add(E e);


三、为什么要设计泛型?

所以为什么要有泛型呢?直接用Object类型存储数据不香吗?

以集合为例,当我们不使用泛型时:

    public void test1() {
        List<Object> list = new ArrayList<>();
        list.add(123);
        list.add(456);
        list.add("789");
        for (Object o : list) {
            Integer item = (Integer) o;
            System.out.println(item);
        }
    }

运行结果:

当我们使用泛型时:

    public void test2() {
        List<Integer> list = new ArrayList<>();
        list.add(123);
        list.add(456);
//        list.add("789");添加失败
        for (Integer integer : list) {
            System.out.println(integer);
        }
    }

我们可以发现,使用泛型后,当添加的数据类型不满足条件时,编译就会报错;在遍历集合时,还可以避免强制类型转换。


四、自定义泛型结构

1、自定义泛型类

public class Order<T> {
    String orderName;
    int orderId;
    //类的内部结构就可以使用类的泛型
    T orderT;
    //构造器
    public Order(){
        //泛型数组
        T[] arr = (T[]) new Object[8];
    }
    public Order(String orderName,int orderId,T orderT){
        this.orderName = orderName;
        this.orderId = orderId;
        this.orderT = orderT;
    }
    //注意,下面的三个方法都不是泛型方法
    public T getOrderT(){
        return orderT;
    }
    public void setOrderT(T orderT){
        this.orderT = orderT;
    }
    @Override
    public String toString() {
        return "Order{" +
                "orderName='" + orderName + '\'' +
                ", orderId=" + orderId +
                ", orderT=" + orderT +
                '}';
    }
}

需要注意的是:

  • 异常类不能声明为泛型:

  • 编译不通过:

  • 静态方法中不能使用泛型:因为是静态方法,即可以使用类来调用;当使用类来调用方法时,并不知道参数T指的是什么,所以不行。当使用对象调用方法时,通过构造器创建对象时,就已经指明了T是什么类型。


2、自定义泛型接口

由于类和接口没有很大的区别,所以为了文章的完整性,就继续以类来讲解泛型相关的知识:

class Father<T1, T2> {
}
// 子类不保留父类的泛型
// 1)没有类型 擦除
class Son1 extends Father {// 等价于class Son extends Father<Object,Object>{
}
// 2)具体类型
class Son2 extends Father<Integer, String> {
}
// 子类保留父类的泛型
// 1)全部保留
class Son3<T1, T2> extends Father<T1, T2> {
}
// 2)部分保留
class Son4<T2> extends Father<Integer, T2> {
}

class Father<T1, T2> {
}
// 子类不保留父类的泛型
// 1)没有类型 擦除
class Son<A, B> extends Father{//等价于class Son extends Father<Object,Object>{
}
// 2)具体类型
class Son2<A, B> extends Father<Integer, String> {
}
// 子类保留父类的泛型
// 1)全部保留
class Son3<T1, T2, A, B> extends Father<T1, T2> {
}
// 2)部分保留
class Son4<T2, A, B> extends Father<Integer, T2> {
}

总结:

  • 泛型如果不指定,将被擦除,泛型对应的类型均按照Object处理,但不等价 于Object。经验:泛型要使用一路都用。要不用,一路都不要用。
  • 如果泛型结构是一个接口或抽象类,则不可创建泛型类的对象。
  • 泛型的指定中不能使用基本数据类型,可以使用包装类替换。

3、自定义泛型方法

  • 方法,也可以被泛型化,不管此时定义在其中的类是不是泛型类。在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。
  • 泛型方法的格式:[访问权限] <泛型> 返回类型 方法名([泛型标识 参数名称]) 抛出的异常
    //这些都是泛型方法:
    public <E> void say(List<E> list) { }

    public static <E> List<E> copyFromArrayToList(E[] arr) {
       ArrayList<E> list = new ArrayList<>();
       for (E e : arr)
           list.add(e);
       return list;
    }
Python 爬虫实战:爬取今日头条文章与阅读量数据 本文详细介绍了基于Python爬取今日头条文章与阅读量数据的完整方案。通过分析今日头条API接口,采用Requests+正则表达式技术实现数据抓取,重点解决加密参数构造、请求头模拟、反爬规避等核心问题。文章包含文章列表获取、详情数据提取、互动数据采集等完整流程,并提供数据存储与基础分析方法。同时强调合规使用爬虫技术,控制爬取频率,避免干扰平台运营。该方案可为内容传播分析、用户兴趣研究提供数据支持,但需注意接口参数更新和反爬机制变化,适时调整代码实现。 阅读详情

相关推荐

IVP 2021 UNETR: Transformers for 3D Medical Image Segmentation

动机 具有跟踪和扩展路径的全卷积神经网络(FCNNs)(如编码器和解码器),近年来在各种医学图像分割应用中显示出了突出的地位。在这些体系结构中,编码器通过学习全局上下文表示来扮演一个不可或缺的角色,该全局上下文表示将进一步用于解码器的语义输出预测。 卷积层作为FCNN的主要构造块,其局部性限制了此类网络学习长时空间依赖的能力。 在NLP领域,基于transformer的模型已经在各种任务中实现了最先进的基准。transformer中的自我注意机制使他们能够动态地突出词序列的重要特征并学习其长时依赖关系。这

smile909的博客 1979

java 1.5 新特性_Jdk1.5中的新特性 --泛型 (详细版)

本来只转载了个链接,和一个简单的使用程序,但昨天不小心看到有人批判jdk1.5,先说java要强制转型不好的问题没解决,容器不能放基类型不好,接着说泛型没用。而恰恰Jdk1.5中解决了这些问题,所以感叹之余,把这篇文章改一下,详细的说说泛型。一,Java中的泛型:在Java中能使用到泛型的多是容器类,如各种list map set,因为Java是单根继承,所以容器里边可以放的内容是任何Object...

weixin_36128337的博客 372

JAVA + 海康威视SDK + FFmpeg+ SRS 实现海康威视摄像头二次开发

海康威视SDK接入方案摘要 本文介绍了使用海康威视官方SDK开发物联网平台摄像头接入功能的完整方案。系统采用Java后端集成HCNetSDK控制摄像头,通过FFmpeg将RTSP流转为RTMP推送到SRS流媒体服务器,前端基于HTTP-FLV协议实现视频播放。文章详细说明了开发准备工作,包括SDK下载、SRS部署、FFmpeg安装等关键步骤,并提供了数据库表设计和接口定义。核心部分展示了如何集成海康SDK,包括提取必要代码、加载DLL文件、配置打包插件等具体实现细节,最终形成了一套支持实时预览、回放和下载的

2401_83057947的博客 2267

为什么要使用泛型

从开发第一个系统,一直在使用泛型。那么为什么要使用泛型呢?或者说泛型有什么好处。    先来看官方的的解释:          泛型类和泛型方法同时具备可重用性、类型安全和效率,这是非泛型类和非泛型方法无法具备的。 泛型通常用与集合以及作用于集合的方法一起使用。 .NET Framework 2.0 版类库提供一个新的命名空间 System.Collections.Generic,其中包

一个程序员的一些碎碎念 5655

bert-ini:一种基于bert的实体对齐交互模型

本次分享一项来自IJCAI-20的实体对齐工作,该工作提出了一种不同于以往的采用图结构信息进行实体对齐的技术方案,该方案取得了当时的最好效果;不仅如此,模型本身的对齐效率在该项工作中也被考虑,实际工作中非常具备借鉴意义。

qq_33331424的博客 3155

SAP CO实战:如何用KKA2/CJ88结果分析码搞定项目收入成本匹配(附真实案例)

本文深入探讨了SAP CO模块中KKA2和CJ88结果分析码在项目收入成本匹配中的高阶应用。通过真实案例解析,详细介绍了这两种分析码在分阶段收入确认和终验法项目中的配置技巧与实战经验,帮助财务人员高效解决复杂业务场景下的财务数据处理难题。

weixin_29230773的博客 171

类上面加泛型的理解

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34341117的博客 2440

Ubuntu上安装Claude Code CLI:从环境配置到排错全攻略

在Linux开发环境中,命令行工具的安装与配置是开发者绕不开的基础技能。无论是AI编程助手还是其他CLI工具,其运行都依赖于正确的运行时环境和包管理机制。以Node.js生态为例,版本管理器nvm解决了多版本切换的痛点,npm则负责全局包的安装与依赖解析。理解PATH环境变量的执行逻辑、全局bin目录的作用以及权限控制,是排查“命令找不到”或“EACCES”错误的关键。这些基础知识应用广泛,从本地开发到服务器部署都至关重要。本文以Ubuntu系统上安装Anthropic的Claude Code CLI为例,

weixin_28842367的博客 273

7、深入分析java中的泛型机制

想要学好java,泛型机制是一个必须要掌握的知识点,无奈很多书上写的不是很啰嗦,就是概念太多难以理解,因此参考了很多篇文章,对其进行整理了一下,希望对你有所帮助。 一、认识泛型 1、为什么要引入泛型? 泛型其实是在jdk1.5中才添加的。在jdk1.5之前我们要创建一个容器对象,是这样往里面添加内容的。 List list = new ArrayList(); list.add("我是字符串");...

冯冬冬的博客 465

声音事件检测metric:PSDS

这项工作为多声道声音事件检测(SED)系统的性能评估定义了一个新的框架,它克服了传统的collar-based事件决定、事件F-cores和事件错误率的限制。拟议的框架引入了对事件检测的定义,该定义对标签的主观性更为稳健。它还采用了多声道接收器操作特性(ROC)曲线,以提供比F1分数更全面的系统性能洞察力,并建议将这些曲线简化为单一的多声道声音检测分数(PSDS),这允许系统独立于操作点(OPs)进行比较。所提出的方法还能更好地了解不同声音类别的数据偏差和分类稳定性。

Maestro_T的博客 2730

【AI黑话日日新】什么是AI Infra?

是支撑AI模型开发、训练、推理、部署与规模化运营的,是连接底层算力与上层AI应用的“数字基建”。没有高效的AI Infra,大模型训练、推理与落地都无法高效实现。

专注:太空算力、AI infra、异构调度、大模型成本工程 1114

JDK 1.5引入的新特性 -- 泛型

1. 引言JDK 1.5 中引入了新的语言成分, 泛型(Generics)是其中较为重要的一个.简单的泛型(Defining Simple Generics)以下代码摘自java.util包的List接口和Iterator接口的定义:public interface List {  void add(E x);  Iterator iterator();}public interfac

laughcry2002的专栏 4138

Transformer模型在时间序列预测中的应用:价格和产量预测

Transformer模型由Attention is All You Need论文提出,并在机器翻译任务上取得了巨大成功。其主要特点是使用自注意力机制代替传统的递归或卷积操作进行序列建模。Transformer模型由编码器和解码器组成,其中编码器用于学习输入序列的表示,解码器用于生成目标序列。在时间序列预测中,我们只需要使用Transformer的编码器部分。编码器将历史数据作为输入,学习一个表示,然后使用该表示来预测未来的数值。

HnrzLinux的博客 739

十四:泛型

跳转到总目录 文章目录01、为什么要有泛型1.1、举例1.2、泛型的设计背景1.3、其他说明1.3、那么为什么要有泛型呢02、在集合中使用泛型2.1、举例2.2、练习03、自定义泛型结构3.1、自定义泛型类举例3.2、自定义泛型类泛型接口的注意点3.3、自定义泛型方法举例3.4、举例泛型类和泛型方法的使用情境04、泛型在继承上的体现【通配符】05、通配符的使用5.1、使用通配符后数据的读取和写入要求5.2、有限制条件的通配符的使用06、泛型应用举例6.1、泛型嵌套6.2、实际案例07、自定义泛型类练习 01

本人主攻Java,希望自己能成为出色的程序员。 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

在jdk1.5中,引入了泛型,泛型的存在是用来解决什么问题。

首先我们要了解:什么是向下转型和向上转型。 面向对象的转型只会发生在具有继承关系的父子类中(接口也是继承的一种) 向上转型:其核心目的在于参数的统一上,根本不需要强制类型转换。 向下转型:是为了操作子类定义的特殊功能,需要强制类型转换,可是现在存在的问题是:向下转型其实是一种非常不安全的操作,以为编译的时候,程序不会报错,而在运行的时候会报错,这就是传说中的—迷之报错。 不过呢,在JDK1.5之...

riemann_的博客 5155

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【11章Java泛型】全面解读Java泛型

【11章Java泛型:为什么要有泛型?集合中使用泛型、自定义泛型结构、在继承上的说明、通配符的使用】

小鳴人的博客 2164

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Java 数据结构】泛型

(1)JDK1.5以后(2)泛型实际就是 一个引起来的 参数类型,这个参数类型 具体在使用的时候才会确定具体的类型。(3)使用了泛型以后,可以确定集合中存放数据的类型,在编译时期就可以检查出来。(4)使用泛型你可能觉得麻烦,实际使用了泛型才会简单,后续的遍历等操作简单。都是引用数据类型,不能是基本数据类型。在JDK1.7以后可以写为:-- ---钻石运算符1.泛型类,泛型接口/*** GenericTes就是一个普通的类。

书生-w的博客 1万+

第13章_泛型(集合中使用泛型,比较器中使用泛型,自定义泛型结构,泛型在继承上的体现,通配符的使用)

举例1:中药店,每个抽屉外面贴着标签举例2:超市购物架上很多瓶子,每个瓶子装的是什么,有标签举例3:家庭厨房中:Java中的泛型,就类似于上述场景中的标签。1、这种语法形式就叫泛型。的形式我们称为类型参数,这里的"类型"习惯上使用T表示,是Type的缩写。即:。:代表未知的数据类型,我们可以指定为,,等。类比方法的参数的概念,我们把,称为类型形参,将称为类型实参,有助于我们理解泛型这里的T,可以替换成K,V等任意字母。2、在哪里可以声明类型变量

小丁的博客 1244

Java JDK1.5: 泛型 新特性的讲解说明

在任何不重要的软件项目中,错误都只是生活中的事实。仔细的计划,编程和测试可以帮助减少他们的普遍性,但不知何故,在某个地方,他们总是会找到一种方法来进入你的代码。随着新功能的推出以及您的代码库规模和复杂性的增加,这一点变得尤为明显。幸运的是,一些错误比其他错误更容易被发现。例如,编译时错误可以在早期发现;你可以使用编译器的错误信息来找出问题所在,然后修正它。运行时错误,然而,可能是更多的问题;它们并不总是立即出现,而且当它们这样做时,它可能在程序中的某一点远离问题的实际原因。

weixin_61635597的博客 648

Java高级编程—泛型

新秧初出水,渺渺翠毯齐,及时趁芒种,散著畦东西。一入芒种,收苗插秧,又到了农家最忙碌的季节。中国自古便有着博大精深的农耕文化,梯田更是其中的历史瑰宝,它既体现了农人与自然和谐共生的智慧,也形成了独具地方风情的人文景观。来到丹寨高要梯田,在田野中感受夏日微热的风,在这个芒种时节返璞归真,让诗意的烟火尽情纵横于山野之间。

triumph_421的博客 1761

泛型的详解和自定义泛型结构

一 泛型的概念  所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类 型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如, 继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实 际的类型参数,也称为类型实参)。  从JDK1.5以后,Java引入了“参数化类型(Parameterized type)”的概念, 允许我们在创建集合时再指定集合元素的类型,正如:List,这表明 该List只能保存字符串类型的对象。  JDK1.5改写了集合框架中的全部接口

weixin_45943192的博客 681

Java泛型-泛型作用+泛型在各种数据结构中的使用+自定义泛型

文章目录1. 概念2. 为什么要使用泛型(Generic)2.1 在ArrayList中使用泛型2.2 在HashMap中使用泛型3. 自定义泛型结构3.1 泛型类与泛型接口3.2 泛型类的子类3.3 自定义泛型类/接口 仍需注意的点3.5 泛型方法 1. 概念 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时〈例如,继承或实现这个接口,用这个类型声明变量、创建对象时) 确定〈即传入实际的类型参数,也称为类型实参) 。

weixin_45791318的博客 617

Java-泛型(Generic)

和,其中,T,K,V不代表值,而是表示一种类型。这里使用任意字母都可以。常用T表示,是Type的缩写。// 使用T类型定义变量 private T info;// 使用T类型定义一般方法 public T getInfo() {} // 使用T类型定义构造器 public Person() {}[访问权限] 返回类型 方法名([泛型标识 参数名称]) 抛出的异常} }...

weixin_52533007的博客 4194

Java泛型

在Java中,我们在声明方法时,当在完成方法功能时如果有未知的数据需要参与,这些未知的数据需要在调用方法时才能确定,那么我们把这样的数据通过形参表示。在方法体中,用这个形参名来代表那个未知的数据,而调用者在调用时,对应的传入实参就可以了。受以上启发,JDK1.5设计了泛型的概念。泛型即为“类型参数”,这个类型参数在声明它的类、接口或方法中,代表未知的某种通用类型。集合类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以。

qq_63088307的博客 1316

Java泛型(1)--集合使用泛型Generic、自定义泛型、泛型在继承上的体现、通配符的使用

文章目录泛型的概念集合中使用泛型自定义泛型结构泛型在继承上的体现通配符的使用 泛型的概念 集合容器类在设计阶段/声明阶段不能确定这个容器实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于这个元素如何保存,如何管理等是确定的,因此把元素的类型设计成一个参数,这个类型参数叫做泛型。Collection<E>,ArrayList<E> 中<E>就是类

叶绿体不忘呼吸 583

数据结构 - 泛型

今天给大家介绍一下泛型的使用一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的 代码,这种刻板的限制对代码的束缚就会很大。----- 来源《Java编程思想》对泛型的介绍。泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。

weixin_73869209的博客 525
上一篇: 为什么要有包装类,顺便说一说基本数据类型、包装类、String类该如何转换?
下一篇: 记一次To B开发普通的性能优化历程......报表优化
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值