Java泛型使用及局限
Java泛型的局限和使用经验
泛型的局限
- 任何基本类型不能作为类型参数
经过类型擦除后,List中包含的实际上还是Object的域,而在Java类型系统中Object和基本类型是两套体系,需要通过“自动装包、拆包机制”来进行交互。
2.任何在运行时需要知道确切类型信息的操作都无法工作。
由于Java的泛型是编译期泛型(在进入运行时后没有泛型的概念),因此运行时的类型转换和类型判定等操作都没有效果。
3.冲突1:方法名一样,参数列表是同一个类型参数的两个泛型方法,重载将产生相同的函数签名;
在泛型擦除后,这两个方法签名完全相同,产生冲突;
4.冲突2:使用泛型接口时,需要避免重复实现同一个接口
5.不能在静态域或方法中引用类型参数
在方法的签名里多了一个static关键字,然后引发编译错误的原因就变成了:在静态域中无法引用类型变量
泛型的常用经验
- 尽量消除异常,初学者容易写出使用原生类型的代码,或者使用泛型不当的代码,现在编辑器非常先进,尽量消除提示的异常;对于开发者自己确认不需要消除切可以工作的代码,可以使用@SuppressWarnings("unchecked")屏蔽掉异常;
- 能用泛型类(或接口)的时候尽量使用;能用泛型方法的时候尽量使用泛型方法;
- 定义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泛型的局限和使用经验 泛型的局限 任何基本类型不能作为类型参数 经过类型擦除后,List中包含的实际上还是Object的域,而在Java类型系统中Object和基本类型是两套体系,需要通过“自动装包、拆包机制”来进行交互。 2.任何在运行时需要…...
Sklearn线性回归
Scikit-learn 中的线性回归是一个用于监督学习的算法,它用于拟合数据集中的特征和目标变量之间的线性关系。以下是使用 Scikit-learn 实现线性回归的基本步骤: 1. 导入所需库 首先,你需要导入所需的库和模块。 import numpy as np import …...
APP中互联网公司的必备知识
APP中互联网公司的必备知识 敏捷开发(scrum)模型角色工作流程 项目上线发布策略发布流程灰度发布 APP发布APP软件包类型APP客户端(内部)发布平台APP客户端(线上)发布平台 熟悉APP项目(tpshop&am…...
论文翻译 - Visual Adversarial Examples Jailbreak Large Language Models
论文链接:https://arxiv.org/pdf/2306.13213.pdf 项目代码: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(或sql生成数据库) 主要技术: 基于C#wpf架构和sql server数据库 功能模块: 顾客登录后可以查询花卉详情然后购买 店主登录管理后台 顾客管理 删除顾客多行删…...
如何在群晖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版本,通过…...
【C语言程序设计】C语言求圆周率π(三种方法)
题目一: 利用公式①计求π的近似值,要求累加到最后一项小于10^(-6)为止。 程序代码: #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端口:FTP(文件传输协议)服务端口。FTP允许用户进行文件传输,如上传和下载文件。22端口:SSH(安全外壳协议)服务端口。SSH用于远程登录到服务器,并提供加密的数据传输。23端口&#…...
Linux(ubuntu) 安装kotlin
Kotlin 是一种基于 Java 语言的静态类型编程语言,它可以运行于 JVM 上 1. 安装 Java Development Kit (JDK) Kotlin 运行于 JVM 上,所以首先需要安装 Java Development Kit(JDK) Ubuntu 或 Debian 系统 sudo apt update sudo a…...
微信小程序提交成功设置提示
在微信小程序中,当用户成功提交表单或完成某项操作后,通常我们会设置一个提示来告知用户操作已完成。这种提示通常可以通过几种方式来实现,例如使用 wx.showToast 方法显示一个短暂的提示消息,或者跳转到一个新的页面并显示成功信…...
Pycharm与Anaconda安装
网址: Pycharm:https://www.jetbrains.com/pycharm/ Anaconda:https://www.anaconda.com/download/ 官网下载速度太慢可以选择到清华源下载:https://repo.anaconda.com/archive/ 一:Anaconda安装 安装: …...
阿里云数据盘挂载目录
1、先登录服务器创建新目录aaa 2、云盘都快照备份下。后续操作完核实无误了,您根据您需求删除快照就行, 然后登录服务器内执行: fdisk -l lsblk blkid ll /aaa 3、执行:(以下命令是进行数据盘做ext4文件系统并挂载到…...
【Python】探索PyPinyin 库:Python 中的中文拼音转换工具
花未全开月未圆, 半山微醉尽余欢。 何须多虑盈亏事, 终是小满胜万全。 —— 《对抗路—吕布》 PyPinyin 是一个功能强大的 Python 库,用于将中文文本转换为拼音。它提供了丰富的功能,能够满足各种中文文本处理的需求。在本文中&am…...
Linux运维总结:Centos7.6之OpenSSH7.4升级版本至9.3
一、环境信息 操作系统:Centos7.6.1810 OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 注意:升级后由于加密算法的区别,低版本的SSH工具可能无法连接,建议改用Xshell7或SecureCRT9.0以上版本。 二、注意事项 1、 检查防火墙或selinux是否…...
SD-WAN能解决企业网络的哪些问题?
SD-WAN技术的崛起为企业网络带来了全新的解决方案。在数字化转型、云计算、远程办公和5G等领域,SD-WAN技术展现出强劲的市场趋势。那么,SD-WAN究竟能够解决企业网络中的哪些难题呢? 提升网络带宽利用率 传统网络在连接分支机构时,…...
Python实战:Python集合的常见操作
Python集合(set)是一种无序且元素唯一的容器,它是Python中一种基本的数据结构。本文将详细介绍Python集合的常见操作,包括创建集合、添加和删除元素、集合运算、集合推导式等。 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 这个里面有一个丢包的例子是说,如果tx-queue的大小不够大&am…...
揭秘数据之美:利用 Bokeh 轻松构建实时、动态的数据可视化项目
1、引言 想让你的数据跃然 “屏” 上?厌倦了静态图表的平淡无奇?那么,今天就让我们一起探索 Python 世界中的瑰宝 ——Bokeh 库。这款强大的可视化工具以其流畅的交互性和实时更新能力,让你的数据呈现如电影般生动立体࿰…...
性能测试场景分析并设计?超细案例讲解
前言 性能测试场景,其实和功能测试没什么区别,只是侧重点不同。 我们在功能测试中经常用到的等价类边界值等分析和设计测试case的方法,目的是为了尽可能的覆盖业务场景,避免遗漏导致的功能逻辑缺失或者未达到预期。 而在性能测试…...
零基础入门CGCNN:3步用AI预测材料属性的神奇工具
零基础入门CGCNN:3步用AI预测材料属性的神奇工具 【免费下载链接】cgcnn Crystal graph convolutional neural networks for predicting material properties. 项目地址: https://gitcode.com/gh_mirrors/cg/cgcnn 想用人工智能预测新材料性能却不知从何入手…...
基于Matlab/Simulink的直流电机双闭环调速系统参数优化与动态响应分析
1. 直流电机双闭环调速系统基础认知 第一次接触直流电机双闭环调速系统时,我被那一堆专业术语绕得头晕——什么ASR、ACR、转速环电流环,感觉像在听天书。后来在实际项目中摸爬滚打才发现,这套系统本质上就是个"双保险"设计。想象一…...
提升游戏资源管理效率:Steam清单获取的自动化解决方案
提升游戏资源管理效率:Steam清单获取的自动化解决方案 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 你是否曾遇到想要备份Steam游戏却不知从何下手?或者尝试解析游戏文…...
DAMOYOLO-S模型蒸馏实战:将大模型知识迁移至轻量模型
DAMOYOLO-S模型蒸馏实战:将大模型知识迁移至轻量模型 你是不是也遇到过这样的烦恼?好不容易训练出一个精度很高的目标检测模型,比如DAMOYOLO-S,效果确实不错,但模型体积大、计算慢,想把它放到手机或者边缘…...
深蓝词库转换:打破30+输入法壁垒的终极解决方案
深蓝词库转换:打破30输入法壁垒的终极解决方案 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 深蓝词库转换(imewlconverter)是一…...
6、深入解析transforms.RandomAffine():参数详解与实战应用
1. 什么是RandomAffine变换? RandomAffine是PyTorch中torchvision.transforms模块提供的一个非常实用的图像增强方法。简单来说,它能够对图像进行一系列随机的仿射变换操作。你可能要问:什么是仿射变换?其实它就是我们日常生活中常…...
Swagger Client 性能优化:10个技巧让你的 API 调用快如闪电
Swagger Client 性能优化:10个技巧让你的 API 调用快如闪电 【免费下载链接】swagger-js Javascript library to connect to swagger-enabled APIs via browser or nodejs 项目地址: https://gitcode.com/gh_mirrors/sw/swagger-js Swagger Client 是一款强大…...
Python3.10开发环境搭建指南:Miniconda镜像简化部署流程
Python3.10开发环境搭建指南:Miniconda镜像简化部署流程 1. 为什么选择Miniconda-Python3.10 Python作为当今最流行的编程语言之一,版本管理一直是开发者面临的挑战。Miniconda-Python3.10镜像提供了一种轻量级解决方案,它能帮你࿱…...
ens33网络接口DOWN状态诊断与修复:从基础命令到Netplan配置
1. 为什么ens33接口会突然DOWN掉? 最近在调试Ubuntu虚拟机时,突然发现网络连接断了。用ip addr一看,ens33接口的状态赫然显示着"DOWN"。这种情况在虚拟化环境中其实很常见,我遇到过不下十次。通常表现为:虚拟…...
UsbDk:突破Windows USB访问壁垒的开源驱动开发套件
UsbDk:突破Windows USB访问壁垒的开源驱动开发套件 【免费下载链接】UsbDk Usb Drivers Development Kit for Windows 项目地址: https://gitcode.com/gh_mirrors/us/UsbDk 技术背景解析 解构Windows USB访问限制 在Windows操作系统架构中,USB设…...
