当前位置: 首页 > news >正文

Java泛型使用及局限

Java泛型的局限和使用经验

泛型的局限

  1. 任何基本类型不能作为类型参数

经过类型擦除后,List中包含的实际上还是Object的域,而在Java类型系统中Object和基本类型是两套体系,需要通过“自动装包、拆包机制”来进行交互。

2.任何在运行时需要知道确切类型信息的操作都无法工作。

由于Java的泛型是编译期泛型(在进入运行时后没有泛型的概念),因此运行时的类型转换和类型判定等操作都没有效果。

3.冲突1:方法名一样,参数列表是同一个类型参数的两个泛型方法,重载将产生相同的函数签名;

在泛型擦除后,这两个方法签名完全相同,产生冲突;

4.冲突2:使用泛型接口时,需要避免重复实现同一个接口

5.不能在静态域或方法中引用类型参数

在方法的签名里多了一个static关键字,然后引发编译错误的原因就变成了:在静态域中无法引用类型变量

泛型的常用经验

  1. 尽量消除异常,初学者容易写出使用原生类型的代码,或者使用泛型不当的代码,现在编辑器非常先进,尽量消除提示的异常;对于开发者自己确认不需要消除切可以工作的代码,可以使用@SuppressWarnings("unchecked")屏蔽掉异常;
  2. 能用泛型类(或接口)的时候尽量使用;能用泛型方法的时候尽量使用泛型方法;
  3. 定义API时,尽量使用泛型;


 泛型的概述
泛型:参数化类型

类型形参:<T>,<E>,<K>,<V>,<U>,<R>。。。。

类型实参:必须是引用数据类型,不能是基本数据类型

       <String>,<Integer>,<Student>,<ArrayList<String>>……

形式一:泛型类与泛型接口
1、声明语法格式:

【修饰符】 class 类名/接口<类型形参列表>{   
 
}​
 
【修饰符】 class 类名/接口<类型形参1 extends 父类上限>{   
 
}
 
【修饰符】 class 类名/接口<类型形参1 extends 父类上限 & 父接口上限>{   
 
}
在类名或接口名后面声明的泛型形参类型,可以在当前类或接口中使用,用作声明成员变量、方法的形参、方法的返回值。

但是不能用于静态成员上

2、使用语法格式

在(1)创建泛型类、泛型接口的对象时,为泛型形参指定具体类型

       (2)在继承泛型类或实现泛型接口时,为泛型形参指定具体类型

示例代码

ArrayList<String> list = new ArrayList<String>();
 
ArrayList<String> list = new ArrayList<>();//JDK1.7之后可以省略
 
​class MyStringArrayList extends ArrayList<String>{
 
}​
 
class Employee implements Comparable<Employee>{
 
   public int compareTo(Employee e){       
 
  }
 
}​
 
Arrays.sort(数组,  new  Comparator<泛型实参>(){
 
   public int compare(泛型实参类型  o1, 泛型实参类型  o2){       
 
  }
 
});

3、泛型如果没有指定,会被擦除,按照最左边的上限处理,如果没有指定上限,按照Object处理

形式二:泛型方法
1、声明的语法格式

【修饰符】 <泛型形参列表> 返回值类型 方法名(【数据形参列表】)【throws 异常列表】{}

【修饰符】 <泛型形参 extends 父类上限 & 父接口上限> 返回值类型 方法名(【数据形参列表】)【throws 异常列表】{}
(1)在方法返回值类型前面声明的泛型形参类型,只能在当前方法中使用,用于表示形参的类型或返回值类型,或方法局部变量的类型,和别的方法无关。

(2)泛型方法可以是静态方法,也可以是非静态方法

2、 使用

当调用方法,会根据具体的数据的实参的类型,来确定泛型实参的类型。

通配符?
(1)?:代表任意引用数据类型

(2)? extends 上限:代表上限本身或它的子类

(3)? super 下限:代表下限本身或它的父类

例如:

ArrayList<?>:表示可以接受任意类型

ArrayList<?> list = new ArrayList<String>();
 
ArrayList<?> list = new ArrayList<Integer>();
 
ArrayList<?> list = new ArrayList<Animal>();
ArrayList<? extends 上限>:

ArrayList<? extends Person> list = new ArrayList<Person>();
 
ArrayList<? extends Person> list = new ArrayList<Animal>();//Animal不行,因为Animal是父类
 
ArrayList<? extends Person> list = new ArrayList<Student>();
 
ArrayList<? extends Person> list = new ArrayList<Dog>();//Dog也不行
ArrayList<? super 下限>:

ArrayList<? super Person> list = new ArrayList<Person>();
 
ArrayList<? super Person> list = new ArrayList<Animal>();
 
ArrayList<? super Person> list = new ArrayList<Student>();//Student,因为Student是子类
 
ArrayList<? super Person> list = new ArrayList<Dog>();//Dog也不行
ArrayList<?>:不能添加元素,除了null

ArrayList<? extends 上限>:不能添加元素,除了null

ArrayList<? super 下限>:可以添加下限或下限子类的对象

 Collections工具类
java.util.Collections:工具类,操作集合

(1)public static <T> boolean addAll(Collection<? super T> c, T... elements)

添加elements的几个对象到c集合中。T是elements对象的类型,要求Collection集合的元素类型必须是T或T的父类

(2)public static <T> int binarySearch(List<? extends Comparable<? super T>> list,T key)

在list集合中用二分查找key的下标,如果存在返回的是合理的下标,如果不存在返回的是一个负数下标

T是元素的类型,

<? extends Comparable<? super T>>,要求集合的元素必须实现Comparable接口

<? super T>,在实现Comparable接口,可以指定Comparable<类型实参>为T或T的父类。

(3)public static boolean disjoint(Collection<?> c1, Collection<?> c2)

判断c1和c2没有交集就为true

(4)public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)

求coll集合中最大元素

<T extends Object & Comparable<? super T>>:要求T或T的父类实现Comparable接口

(5)public static <T extends Comparable<? super T>> void sort(List<T> list) 给list集合排序

<T extends Comparable<? super T>>:要求T或T的父类实现Comparable接口

(6)public static <T> Collection<T> synchronizedCollection(Collection<T> c)

以synchronizedXX开头的方法,表示把某种非线程安全集合转为一个线程安全的集合。

(7)public static <T> List<T> unmodifiableList(List<? extends T> list)

相关文章:

Java泛型使用及局限

Java泛型的局限和使用经验 泛型的局限 任何基本类型不能作为类型参数 经过类型擦除后&#xff0c;List中包含的实际上还是Object的域&#xff0c;而在Java类型系统中Object和基本类型是两套体系&#xff0c;需要通过“自动装包、拆包机制”来进行交互。 2.任何在运行时需要…...

Sklearn线性回归

Scikit-learn 中的线性回归是一个用于监督学习的算法&#xff0c;它用于拟合数据集中的特征和目标变量之间的线性关系。以下是使用 Scikit-learn 实现线性回归的基本步骤&#xff1a; 1. 导入所需库 首先&#xff0c;你需要导入所需的库和模块。 import numpy as np import …...

APP中互联网公司的必备知识

APP中互联网公司的必备知识 敏捷开发&#xff08;scrum&#xff09;模型角色工作流程 项目上线发布策略发布流程灰度发布 APP发布APP软件包类型APP客户端&#xff08;内部&#xff09;发布平台APP客户端&#xff08;线上&#xff09;发布平台 熟悉APP项目&#xff08;tpshop&am…...

论文翻译 - Visual Adversarial Examples Jailbreak Large Language Models

论文链接&#xff1a;https://arxiv.org/pdf/2306.13213.pdf 项目代码&#xff1a;https://github.com/Unispac/Visual-Adversarial-Examples-Jailbreak-Large-Language-Models Visual Adversarial Examples Jailbreak Aligned Large Language Models Abstract1 Introduction2 …...

android so载入过程

源自android 9 看源代码的网页 /bionic/libdl/libdl_static.c 好像没用。都是空的 /bionic/libdl/libdl.cpp 主角 22// These functions are exported by the loader 23// TODO(dimitry): replace these with reference to libc.so101// Proxy calls to bionic loader 102_…...

FlowerShop花店管理系统wpf+sqlserver

FlowerShop花店管理系统wpfsqlserver说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于C#wpf架构和sql server数据库 功能模块&#xff1a; 顾客登录后可以查询花卉详情然后购买 店主登录管理后台 顾客管理 删除顾客多行删…...

如何在群晖NAS部署WPS容器并实现无公网IP远程访问本地office软件

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本&#xff0c;通过…...

【C语言程序设计】C语言求圆周率π(三种方法)

题目一&#xff1a; 利用公式①计求π的近似值&#xff0c;要求累加到最后一项小于10^(-6)为止。 程序代码&#xff1a; #include <stdio.h> #include <stdlib.h> #include <math.h> int main(){float s1;float pi0;float i1.0;float n1.0;while(fabs(i)&…...

常见的特殊端口号及其用途

21端口&#xff1a;FTP&#xff08;文件传输协议&#xff09;服务端口。FTP允许用户进行文件传输&#xff0c;如上传和下载文件。22端口&#xff1a;SSH&#xff08;安全外壳协议&#xff09;服务端口。SSH用于远程登录到服务器&#xff0c;并提供加密的数据传输。23端口&#…...

Linux(ubuntu) 安装kotlin

Kotlin 是一种基于 Java 语言的静态类型编程语言&#xff0c;它可以运行于 JVM 上 1. 安装 Java Development Kit (JDK) Kotlin 运行于 JVM 上&#xff0c;所以首先需要安装 Java Development Kit&#xff08;JDK&#xff09; Ubuntu 或 Debian 系统 sudo apt update sudo a…...

微信小程序提交成功设置提示

在微信小程序中&#xff0c;当用户成功提交表单或完成某项操作后&#xff0c;通常我们会设置一个提示来告知用户操作已完成。这种提示通常可以通过几种方式来实现&#xff0c;例如使用 wx.showToast 方法显示一个短暂的提示消息&#xff0c;或者跳转到一个新的页面并显示成功信…...

Pycharm与Anaconda安装

网址&#xff1a; Pycharm&#xff1a;https://www.jetbrains.com/pycharm/ Anaconda&#xff1a;https://www.anaconda.com/download/ 官网下载速度太慢可以选择到清华源下载&#xff1a;https://repo.anaconda.com/archive/ 一&#xff1a;Anaconda安装 安装&#xff1a; …...

阿里云数据盘挂载目录

1、先登录服务器创建新目录aaa 2、云盘都快照备份下。后续操作完核实无误了&#xff0c;您根据您需求删除快照就行&#xff0c; 然后登录服务器内执行&#xff1a; fdisk -l lsblk blkid ll /aaa 3、执行&#xff1a;&#xff08;以下命令是进行数据盘做ext4文件系统并挂载到…...

【Python】探索PyPinyin 库:Python 中的中文拼音转换工具

花未全开月未圆&#xff0c; 半山微醉尽余欢。 何须多虑盈亏事&#xff0c; 终是小满胜万全。 —— 《对抗路—吕布》 PyPinyin 是一个功能强大的 Python 库&#xff0c;用于将中文文本转换为拼音。它提供了丰富的功能&#xff0c;能够满足各种中文文本处理的需求。在本文中&am…...

Linux运维总结:Centos7.6之OpenSSH7.4升级版本至9.3

一、环境信息 操作系统&#xff1a;Centos7.6.1810 OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 注意&#xff1a;升级后由于加密算法的区别&#xff0c;低版本的SSH工具可能无法连接&#xff0c;建议改用Xshell7或SecureCRT9.0以上版本。 二、注意事项 1、 检查防火墙或selinux是否…...

SD-WAN能解决企业网络的哪些问题?

SD-WAN技术的崛起为企业网络带来了全新的解决方案。在数字化转型、云计算、远程办公和5G等领域&#xff0c;SD-WAN技术展现出强劲的市场趋势。那么&#xff0c;SD-WAN究竟能够解决企业网络中的哪些难题呢&#xff1f; 提升网络带宽利用率 传统网络在连接分支机构时&#xff0c;…...

Python实战:Python集合的常见操作

Python集合&#xff08;set&#xff09;是一种无序且元素唯一的容器&#xff0c;它是Python中一种基本的数据结构。本文将详细介绍Python集合的常见操作&#xff0c;包括创建集合、添加和删除元素、集合运算、集合推导式等。 1. 创建集合 Python集合可以通过多种方式创建&…...

Linux: cloud: network: tap tx 丢包一例,vCPU的运行受到主机CPU的占用影响

https://access.redhat.com/documentation/en-us/red_hat_openstack_platform/10/html/ovs-dpdk_end_to_end_troubleshooting_guide/high_packet_loss_in_the_tx_queue_of_the_instance_s_tap_interface 这个里面有一个丢包的例子是说&#xff0c;如果tx-queue的大小不够大&am…...

揭秘数据之美:利用 Bokeh 轻松构建实时、动态的数据可视化项目

1、引言 想让你的数据跃然 “屏” 上&#xff1f;厌倦了静态图表的平淡无奇&#xff1f;那么&#xff0c;今天就让我们一起探索 Python 世界中的瑰宝 ——Bokeh 库。这款强大的可视化工具以其流畅的交互性和实时更新能力&#xff0c;让你的数据呈现如电影般生动立体&#xff0…...

性能测试场景分析并设计?超细案例讲解

前言 性能测试场景&#xff0c;其实和功能测试没什么区别&#xff0c;只是侧重点不同。 我们在功能测试中经常用到的等价类边界值等分析和设计测试case的方法&#xff0c;目的是为了尽可能的覆盖业务场景&#xff0c;避免遗漏导致的功能逻辑缺失或者未达到预期。 而在性能测试…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...