对Java中泛型的理解

JAVA泛型的定义理解以及类型形参的上限 一、引子 List list = new ArrayList(); list.add(1); list.add(2); list.add("String"); System.out.println(list); List <String> lt1 = new ArrayList<>(); List <Integer> lt2 = new ArrayList<>(); 复制代码 观察这样一段代码,我们会发现当使用Arraylist实现List接口的时 阅读详情

泛型(Generic):字面意思就是泛化类型。其实就是”参数化类型“。就是将原来具体的数据类型泛化为一个在编译时暂时不确定的类型。等到使用时才确定具体的数据类型。

1、是什么?

所谓泛型就是在定义类、接口是通过一个标识(菱形语法“<>”)来表示类中某个属性的类型或者是某个方法的返回值或方法的参数类型。这个类型参数将在使用时确定。

2、为什么?

(1)解决元素存储的安全性问题。

a. 未定义泛型时:

List list = new ArrayList();
list.add(111);
list.add(222);
//未定义泛型时,可以存放任意类型的数据,类型不安全
list.add("hello");

b. 定义泛型时:

List<Integer> list = new ArrayList<>();
list.add(111);
list.add(222);
//如果定义了泛型,在编译时,类型检查就会不通过,保证数据的安全
//list.add("hello");

(2)解决获取数据时,需要类型强制转换的问题。

a. 未定义泛型时:

List list = new ArrayList();
list.add(111);
list.add(222);
//未定义泛型,遍历时需要进行强制类型转换,可能会出现ClassCastException
for (Object obj : list) {
    int i = (int) obj;
    System.out.println(i);
}

b. 定义泛型时:

List<Integer> list = new ArrayList<>();
list.add(111);
list.add(222);
//定义了泛型,可以避免强制类型转换
for (Integer i : list) {
    System.out.println(i);
}

3、怎么用?

常用的泛型结构有3种:泛型类、泛型接口、泛型方法。下面通过参考JDK中的 List 和 ArrayList 来说明这三种结构。当然我们也可以自定义泛型。这里只是简单的抽取其中部分代码来说明问题。

(1)泛型类

//在类或接口上声明的泛型,在本类或本接口中即代表某种类型,
public class ArrayList<E> {
    //可以作为非静态属性的类型
    private E[] elementData;
    
    //非静态方法的参数类型或返回值类型, 但在静态方法中不能直接使用类或接口的泛型。
    public E get(int index) {}
    
    public boolean add(E e) {}
}

(2)泛型接口

//和泛型类类似
public interface List<E> {
    
    public E get(int index) {}
    
    public boolean add(E e) {}
    
}

 (3)泛型方法

// 泛型方法的格式:
// [访问权限] <泛型> 返回类型 方法名([泛型标识 参数名称]) 抛出的异常
// 非静态泛型方法 
public <T> T[] toArray(T[] a) {
    ...
}

// 静态泛型方法
public static <T> T staticMethod(T t) {
    System.out.println("staticMethod..." + t);
    return null;
}

(4)泛型的继承

a. 如果子类不确定父类中的泛型类型,可以继承:

public class ArrayList<E> extends List<E> {
    
}

 b. 如果可以确定则可以直接指明父类的泛型类型:

public class ArrayList extends List<Integer> {
    
}

c. 子类还可以再重新定义自己新的泛型:

public class ArrayList<S> extends List<Integer> {
    private S s;
    
    public void show(S s) {}
    
}

 (5)类型通配符 “?”

通配符 “?” 的类型类似于 Object 类型,但不真的是 Object 类型,它可以看成是任何类型的父类。

a. 泛型是 "?"。

<?> : 可以接收任何类型

b. 上界

<? extends A> : 可以接收A类型及其所有的子类类型(可以看做是 <=A)

 c. 下界

<? super A>: 可以接收A类型及其所有的父类类型(可以看做是  >=A)

(6)多个泛型

当使用多个泛型参数时,可以使用“,” 分隔。可以参考 JDK 中的 Map<K, V> 或 HashMap<K, V> 来使用。

注意:

  • 泛型不同的引用不能相互赋值;
    • 尽管在编译时ArrayList<String>和ArrayList<Integer>是两种类型,但是,在运行时只有 一个ArrayList被加载到JVM中
  • 异常类不能是泛型的;
  • 不能使用new E[]。但是可以:E[] elements = (E[])new Object[capacity]; 参考:ArrayList源码中声明:Object[] elementData,而非泛型参数类型数组。

总结:不论是泛型类、泛型接口还是泛型方法都必须先声明再使用。

【Java】泛型概念和使用的理解 文章目录1. 泛型集合2.泛型深入复杂用法2.1 普通泛型2.2 的含义2.3 <?> 的含义2.4 静态泛型 1. 泛型集合 概念:参数化类型、类型安全的集合,强制集合元素的类型必须一致。 特点: 1. 编译时即可检查,而非运行时抛出异常; 2. 访问时,不必类型转换(拆箱); 3. 不同泛型之间引用不能相互赋值,泛型不存在多态。 import java.util.ArrayLis... 阅读详情

相关推荐

关于光耦隔离与SP3485E芯片一起使用无法拉高485使能引脚问题

最近在做的一个项目,定制了一块STM32F407ZG的工控板,工控板载4个485接口全部都是只能接收数据,不能对外发送数据。1.接线不正确:接线不正确导致485收发出现问题。 2.程序端口初始化问题:控制光耦隔离的输入脚IO的初始化和置位状态有问题。 3.GPIO复用问题:控制对应串口的GPIO不是正点原子默认的GPIO,而是经过复用的其他IO,复用问题。 4.程序设置与485E芯片收发模式不对应:对于使能引脚的电平要根据光耦的输出情况确定输入IO与RE的关系,可能模式没有对应。 5.光耦隔离或者SP485

weixin_45862642的博客 2978

泛型

泛型理解 举个例子:一个箱子什么东西都可以装。但是后面,我们嫌箱子装的东西太杂了,就给它贴了一个标签,标签写着“玩具”,那么我们理解这个箱子就是专门装玩具的。 泛型就像上面例子中的标签。 在Java中我们将泛型称为“参数化类型”,就像例子中的标签可以写任何东西,比如化妆品,玩具,水果,衣服等等。类似于方法形参的作用。 所以泛型也称为“类型形参”。 泛型作用 泛型是JDK5新推出的特性。而最能体现泛型作用的就是集合类。JDK5中将集合类全部按照泛型特性处理重写了。 在JDK5前,没有泛型的集合有

优快云 991

MATLAB App Designer 实现多窗口交互与数据传递实战

本文详细介绍了如何使用MATLAB App Designer实现多窗口交互与数据传递的实战技巧。从基础的多窗口应用设计到高级的动态窗口创建,涵盖了窗口调用控制、数据传递方法、状态管理及用户体验优化等核心内容,帮助开发者高效构建复杂的MATLAB GUI应用。

milk5的博客 664

java泛型详解

也就是说,所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别称为泛型类、泛型接口和泛型方法。[访问修饰符] interface 接口名 {//获取集合中的元素,直接使用泛型类型接收数据即可,不需要强制类型转换。//获取集合中的元素,默认为Object类型,强制转换为相应的数据类型。//创建集合并指定泛型,约束集合只能存储String类型的数据。泛型在java中有很重要的地位,并且编程中也是非常常见的,在。泛型1 泛型成员1;泛型1 泛型成员1;

qq_53518630的博客 3795

数字蓝牙功放

数字蓝牙功放(TPA3110+BK8000L),基于D类数字功放芯片TPA3116蓝牙功放,HIFI级带滤波15Wx2蓝牙数字功放,支持有线和蓝牙两种音源输入

runweipa的博客 1419

CONN工具箱分析fmri数据笔记1

前言一、安装二、预处理三、去噪 前言 CONN:functional connectivity toolbox,是基于MATLAB和SPM的一个对功能磁共振数据进行分析的一个工具箱。可以进行以下分析: Seed-based correlations (SBC), ROI-to-ROI correlations, graph analyses, Independent component analyses(group-ICA), Masked (ICA) Amplitude of Low-Frequency.

weixin_52073820的博客 6585

Java中的泛化

在JDK1.5版本中提供了泛型概念,泛型实质上就是使程序员定义安全的类型,在没有提供泛型之前,Java也提供了对Object的引用“任意化”操作,这种任意化操作就是对Object引用进行“向下转型”及“向上转型”操作,但某些强制类型转换的错误也许不会被编译器捕捉,所有强制类型转换存在完全隐患,于是提供了泛型机制。 一、回顾“向上转型”与“向下转型” 通过以下示例来回顾: public cl...

为你灯明三千的博客 6714

【Unity3D框架】GameFramework框架完全教程《全网最全》-专栏文章目录

最近准备学习框架,了解到GameFramework框架是国产Unity3D框架,准备学习一下,但是奈何全网关于这个框架的教程实在太少。为了让自己学习方便一些,也为了让后来者乘凉。将框架以自己的理解整理目录,并且补全教程。觉得教程有帮助别忘了一键三连哦。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2万+

类型泛化

在C++中,template&lt;typename T,...&gt; vector{...};如果我们写vector&lt;int&gt; vec;则T=int。在python中有类似的用法。from typing import TypeVar T=TypeVar('T'); class A(object): def __init__(self): print("A"); cla...

rasishou的博客 1292

2022年华为ICT大赛 全球总决赛!中文综合任务书-网络赛道真题!

2022年华为ICT大赛 全球总决赛!综合任务书-网络赛道真题-中文翻译版

君逍遥o 2403

GB28181 —— 3、C++编写GB28181设备端,完成注册、注销、保活心跳、响应查询目录等功能(附源码)

GB28181 —— Win10下编写GB28181设备端,完成注册、注销、保活心跳、响应查询目录等功能(附源码)

1308

Java 中的泛型(超全详解)

泛型的出现就是为了统一集合当中数据类型的尖括号 <> 中的 泛型标识被称作是类型参数,用于指代任何数据类型。T :代表一般的任何类。E :代表 Element 元素的意思,或者 Exception 异常的意思。K :代表 Key 的意思。V :代表 Value 的意思,通常与 K 一起配合使用。S :代表 Subtype 的意思,文章后面部分会讲解示意。自己实现集合/*E: 表示不确定的类型,该类型在类名后面已经定义过了e: 形参的名字,变量名*/

weixin_65752158的博客 3万+

如何在 R 中使用 Gamma 分布(附示例)

在统计学中,伽马分布通常用于模拟与等待时间相关的概率。我们可以使用以下函数来处理 R 中的 gamma 分布:dgamma(x, shape, rate) – 找到具有特定形状和速率参数的 gamma 分布的密度函数值。 pgamma(q, shape, rate) – 找到具有特定形状和速率参数的伽马分布的累积密度函数值。 qgamma(p, shape, rate) – 找到具有特定形状和速率参数的 gamma 分布的逆累积密度函数值。 rgamma(n, shape, rate) – 生成 n 个随机

Mrrunsen的博客 4415

java 泛型怎么理解_Java中泛型的理解

Java中的泛型,本质上来说,就是是参数化类型,就是说所操作的数据类型被指定为一个参数,而不是确定的某种类型。这种数据类型可以用在类、接口和方法创建中。即泛型类、泛型接口、泛型方法。这样说可能不够生动,来举些例子说明一下。例子一我们通过 例子一来简单看看泛型的应用场景。下面的情况中,没有使用泛型:public classFanXingTest {public static voidmain(Str...

weixin_32482133的博客 379

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

IMSL CNL 7.0.0 (x86-64)Crack

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

深入理解 Java 泛型

???? 本文已归档到:「javacore」 ???? 本文中的示例代码已归档到:「javacore」 1. 为什么需要泛型 JDK5 引入了泛型机制。 为什么需要泛型呢?回答这个问题前,先让我们来看一个示例。 public class NoGenericsDemo { public static void main(String[] args) { List list = n...

静默虚空的专栏 929

数学建模模型总结

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

java 对泛型的理解_Java泛型理解

java泛型通俗的讲,泛型就是操作类型的占位符一、通常泛型的写法1.1定义泛型类public class ApiResult{int resultCode;String resultMsg;T resultObject;}1.2定义泛型方法public JsonUtil{public T str2Json(String jsonText, Class target){T result = nul...

weixin_39900206的博客 151

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

深入理解java泛型

今天在这里我就说说java中的泛型,首先我们要先了解几个基本的问题 1.什么是泛型?为什么会出现泛型? 在说这个问题之前,我们先说一下List集合,我们在使用集合的时候,基本都会在后面加上一对尖括号,并在里面指定一个类型,例如List &amp;lt; String&amp;gt; ,表示这个集合中只能存放String类型的变量,这也是我们要说的泛型,在java5之前是并没有泛型的,在没有泛型的年代,如果我们要...

qq_36258498的博客 559

JAVA泛型理解

一. 术语 泛型:声明中具有一个或者多个类型参数的类或者接口,就是泛型; 原生态类型:每一种泛型都定义一个原生态类型(raw type),即不带任何实际类型参数的泛型名称。例如,与List<E>相对应的原生态类型是List。原生态类型就像从类型声明中删除了所有泛型信息一样,他们的存在主要是为了与泛型出现之前的代码相兼容。 二. 理解 从技术的角度来说,像E、List<E>和List<String>这样的类型应称作不可...

zhangweiocp的专栏 366

java泛型 深入_深入理解java泛型详解必看

深入理解java泛型详解必看时间:2017-09-14来源:互联网Java 泛型(generics)是 JDK5中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型.今天华清Java学院小编就带领大家一起深入理解Java泛型。①什么是Java泛型?Java泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.假定我们有这样一个需求:...

weixin_33171058的博客 606

泛型方法的定义和使用_深入理解Java泛型(一.泛型的作用与定义)

点击上方“蓝字”关注我们吧!泛型的作用与定义类型的参数化,就是可以把类型像方法的参数那样传递泛型使编译器可以在编译期间对类型进行检查以提高类型安全,减少运行时由于对象类型不匹配引发的异常。1. 泛型是什么一说到泛型,大伙肯定不会陌生,我们代码里面有很多类似这样的语句:List list=new ArrayList<>();ArrayList就是个泛型类,我们通过设定不同的类型...

weixin_39888180的博客 1万+

Java泛型:从入门到精通 (带你彻底理解泛型)

Java泛型是JDK5引入的参数化类型特性,通过类型参数(T/E/K/V)实现编译时类型检查,解决集合类型不安全、代码冗余问题。主要用法包括泛型类、接口和方法,支持边界限制(extends)和通配符(?/extends/super)处理继承关系。泛型通过类型擦除在编译后转为边界类型或Object,导致运行时无法获取泛型信息,且存在创建对象/数组等限制。正确使用需区分泛型类/方法、理解通配符应用场景(读取用extends,写入用super),避免基本类型、泛型数组等常见错误。泛型本质是依赖抽象实现多态,保证类

0和1的舞者的博客 1304

Java中泛型的理解

以前一直对Java的泛型理解不深,除了知道这玩意在List、Set等容器应用外,自己貌似也没太了解过,今天正好看了看。去看看视频就能理解了,讲的非常好,我只在这里简单记录一下,感觉就是为了统一多个数据类型。

pige666的博客 254

java泛型理解

java泛型理解 泛型在java中经常使用,有很重要的作用,在做软件构造的实验,我对泛型的理解不是很深,但随着了解和运用越来越多,理解也就加深了,这里记录一下学习的理解 什么是泛型? 泛型,即“参数化类型”,是对java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类,可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样,泛型的本质是为了参数化类型,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型,在泛型使用过程中,操

weixin_45607713的博客 405

对Java中的泛型(包括泛型擦除)的理解

为什么要使用泛型 在明确数据类型的时候可以具体用哪种数据类型,而对于不明确的,则需要泛型来实现 比如 public class TestBean<T> { private T value; public T getValue() { return value; } public void setValue(T value) { ...

祝起光的博客 542
上一篇: 对Java中注解的理解
下一篇: 浅谈静态代理与动态代理
ProgrammingWay
博客等级 码龄9年 58粉丝 21原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值