泛型的约束与局限性

保姆级教程:用YOLOv8/9/10搞定仪表盘指针识别,附完整数据集和Python环境配置 本文提供了一份基于YOLOv8/v9/v10的仪表盘指针检测全流程指南,涵盖环境配置、数据集构建、模型选型、训练调优和部署落地等关键步骤。通过详细的代码示例和实战经验,帮助开发者高效解决工业视觉中的仪表盘检测难题,特别适合电力巡检、智能监控等应用场景。 阅读详情
因为Java并没有真正实现泛型,是编译器在编译的时候在字节码上做了手脚,这种实现理念造成Java泛型本身有很多漏洞。为了规避这些问题Java对泛型的使用上做了一些约束,但不可避免的还是有一些问题存在。这其中大多数限制都是由类型擦除引起的。
1.不能用类型参数替换基本类型:
   其原因是类型擦除,擦除类型后原先的类型参数被Object或者限定类型替换,而基本类型是不能被对象所存储的。可以使用它们的包装类。
 
2.运行时类型检查只是针对泛型类的原始类型进行的。getClass()方法只返回原始类型,因为JVM根本就不知道泛型这回事,它只知道原始类型。
   在《Java Core》中提到的
   Pair a = new Pair();
   a instanceof Pair<String>为真的问题在JDK1.6上面已经不存在,这样的语句是通不过检查的,产生一个"instacneof 泛型类型不合法"的错误。
 
3.异常。不能抛出也不能捕获泛型类的对象,使用泛型类来拓展Throwable也是非法的。
   public class GenericException <T> extends Exception{
            //泛型类无法继承Throwable,非法
   }
   不能在catch子句中使用类型变量。例如,下面的方法将不能编译:
   public static <T extends Throwable> void doWork(Class<T> t){
            try{
                    ...
            }catch(T e){//error --- can't catch type variable
                    ...
           }
   }
   但是,在异常声明中可以使用类型变量。下面这个方法是合法的:
   public static <T extends Throwable> void doWork(T t) throws T{//ok
            try{
                    ...
           }catch(Throwable realCause){
                    t.initCause(realCause);
                   throw t;
           }
   }
 
4.不能声明参数化类型的数组。原因还是类型擦除。
Pair<String>[] p = new Pair<String>[100];//这个是非法的,不能创建泛型数组
如果这样做合法的话,就会引发一个严重问题:
类型擦除之后,p的类型为Pair[],将其转换为Object[]是合法的
Object[] o = p;
数组可以记住它的元素类型,如果试图存入一个错误类型的元素,就会抛出一个ArrayStoreException异常,但是
o[0] = new Pair<Date>();
是可以通过数组存储的检测,因为经过类型擦除Pair<Date>和Pair<String>是相同的类型,但是在取数据的时候,比如o[0].getFirst(),我们知道编译器在字节码中加入了类型强制转换的指令,即(String)o[0].getFirst(),这时候类型错误就会发生,但这之前的一系列操作看起来又都是合法的。Java语言的严密性受到挑战。(如果参数化类型数组像列子那样使用,会导致运行时类型不匹配的错误,而在java中这种错误应该在编译期发现,所以java禁止使用参数化类型数组)
 
5.泛型类型的实例化。
不能实例化泛型类型。例如,下面Pair<T>构造器是非法的:
public Pair(){ first = new T(); second = new T(); }
类型擦除将变量T替换成Object,但这段代码的本意肯定不是调用new Object()。
类似地,不能建立一个泛型数组:
public <T> T[] minmax(T[] a){ T[] mm = new T[2]; ... }
类型擦除会让这个方法总是构造一个Object[2]数组。
但是,通过调用Class.newInstance和Array.newInstance方法,可以利用反射构造泛型对象和数组。
 
6.静态上下文。不能在静态域或者静态方法中引用类型变量。见如下代码:
class C<T> { static T member; C(T t) { member = t; } T getMember() { return member; } public static void main(String[] args) {     C<String> c = new C<String>("test");//1     System.out.println(c.getMember().toString());     new C<Integer>(new Integer(1));//2     System.out.println(c.getMember().toString()); } }
静态域和静态方法是共享的。C中的静态域member到底是什么类型的哪?对程序而言这是个潜在的安全隐患,因为在执行语句2的时候会发生 ClassCastException异常,因为编译器在获取域的时候加入了强制类型转换,不能要求原来是String类型的域,现在引用一个Integer对象。
 
7.类型擦除后的冲突。例如:
public class B<T>{
        public void fun(T t){ ... }//方法1
       public void fun(Object t){ ... }//方法2
}
这两个方法实际上是冲突的,类型擦除后它们具有相同的签名。补救的办法只能是重新命名。
VC Spyglass CDC实战:如何快速定位和解决重汇聚问题(附详细调试步骤) 本文深入探讨了在SoC设计中利用VC Spyglass进行CDC验证时,如何高效定位和解决棘手的重汇聚问题。通过实战演练,详细解析了重汇聚的本质、VC Spyglass的检测逻辑,并提供了从报告筛选、GUI原理图分析到制定设计修复或约束豁免方案的全套调试步骤,帮助工程师快速攻克这一常见验证难题。 阅读详情

相关推荐

非sudo用户如何安全使用Docker:Rootless模式实战指南

Docker Rootless模式是一种基于Linux用户命名空间(userns)的容器运行时安全机制,它通过UID/GID映射、fuse-overlayfs文件系统和slirp4netns网络栈,在不提升权限的前提下实现容器隔离。其核心原理是将容器内root身份映射为宿主机非特权用户,从而规避docker组等价root的安全风险。相比传统root模式,Rootless在权限控制、逃逸防护和多租户隔离方面具备天然优势,适用于CI/CD流水线、Kubernetes边缘节点及受限生产环境。本文聚焦无sudo权限

weixin_30274627的博客 350

2、泛型-泛型的约束与局限性

不能用基本类型实例化类型参数没有Pair&lt;double&gt;,只有Pair&lt;Double&gt;。原因是类型擦除,擦除之后,Pair类含有Object类型的域,而Object不能存储double值。这样做与java语言中基本类型的独立状态相一致。运行时类型查询只适用于原始类型 Pair&lt;LocalDate&gt; pair=new DateInterval(); ...

backbone111的博客 850

PostgreSQL 超详细安装与使用教程:从入门到实战

本文将详细介绍PostgreSQL数据库的安装配置与基础使用。首先从Windows系统安装入手,分步骤讲解17.5版本的安装流程、环境变量配置及服务启动验证。接着重点介绍了pgAdmin4图形化管理工具的安装与使用,包括界面语言设置、数据库连接、创建与管理数据库等操作,同时对比了可视化操作与SQL命令两种方式。最后梳理了PgSQL基础语法,涵盖表的创建、增删改查操作、约束管理等内容,为初学者提供了完整的PostgreSQL入门指南。文章兼顾理论知识与实际操作,既适合数据库新手学习,也可作为开发人员的快速参考

gtf212的博客 1万+

java泛型编程学习 笔记二:使用泛型的约束和局限性

我在java泛型编程学习 笔记一:为什么要使用泛型这篇博文中,曾经提到过java的"泛型机制"属于java的一种语法糖,它存在的目的是简化复杂的代码,以提高程序的安全性。 实际上java虚拟机没有任何类型对象——所有的对象都属于普通类对象,所以说不管我们在任何时候定义一个泛型类型,虚拟机都会为其提供一个“原始类型”。 “原始类型”名称:删去类型变量之后的泛型类型名称。 “原始类型”中类型参数的“擦除”:将类型参数替换为限定类型,无限定类型的替换为Object。

远方和诗 的博客 2557

PHP版本对接支付宝支付接口 电脑网站 详细介绍 沙箱环境 超简单易懂

PHP版本对接支付宝支付接口 其实理顺了思路后,按照我接下来的步骤来,真的超级简单啊,为啥有那么多的朋友们折腾了那么久呢,嘿嘿,跟我走吧~ 我是昨天晚上洗完澡之后,大概八九点,才开始正式开工尝试去这一工程的,我去支付宝的蚂蚁金服开放平台里把各个知识点和文档大概都看了一遍,大致弄明白了要怎么操作了,建议大家看看电脑网站开发文档,忙到了夜里十二点左右,成功地用支付宝给的Demo完成了付款操...

爱玲姐姐的博客 1万+

华为P30/pro (ELE-AL00) 鸿蒙4.2降级 EMUI 9

分享

m0_52356707的博客 1万+

泛型约束与局限性(上)

泛型约束与局限性(上) 由于类型擦除,所以不能使用基本类型实例化类型参数,Object不能存储基本类型的值(基本类型的包装类可以)。 不能使用instanceof比较两个泛型变量的类型参数是否相等,只能比较它们是否为同一泛型。 ArrayList<Number> arrayList = new ArrayList<>(); // 报错泛型类型不合法 System.o...

再无此人的博客 272

Claude Code 完整使用教程(2026最新版)

《Claude Code 完整使用教程(2026最新版)》摘要: Claude Code 是 Anthropic 公司推出的智能编程工具,通过自然语言对话实现代码编写、调试和重构。本教程基于 v2.1.101 版本,涵盖安装配置、核心功能及最新特性。主要内容包括: 多平台安装方式(macOS/Linux/Windows) 桌面应用专属功能如并行会话、定时任务和语音模式 模型选择指南(Sonnet/Opus/Haiku) 快速入门示例:5分钟创建Node.js项目 核心功能:代码读写、命令执行、Git集成等

程序猿_三产 2万+

Java泛型解析(04):约束和局限性

前两节,认识和学习了泛型的限定以及通配符,初学者可能需要一些时间去体会到泛型程序设计的好处和力量,特别是想成为库程序员的同学就需要下去体会通配符的运用了,应用程序员则需要掌握怎么使用泛型,这里针对泛型的使用中的约束和局限性做一个介绍性的讲解。

程序•袁 4022

关于爬虫源影视资源设置

本文介绍了Omnibox 2.1.3版本的爬虫脚本配置方法,重点演示了如何添加猫眼资源数据源。脚本包含完整的API请求处理、数据格式化、视频详情获取和弹幕匹配等功能模块。通过环境变量配置采集站API地址和弹幕API地址,支持视频列表获取、分类检索、详情查询和播放地址解析等功能。脚本采用模块化设计,包含完善的错误处理和日志记录机制,能够将采集站返回的数据转换为标准格式,并支持批量获取视频详情来丰富数据。同时提供了弹幕匹配功能,可根据视频文件名或播放地址自动匹配相关弹幕资源。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 4672

[Python图像处理] 十九.图像分割之基于K-Means聚类的区域分割

前面的文章讲解了图像锐化和边缘提取技术,该篇文章将开始围绕图像分割进行讲解。图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。 本篇文章主要讲解基于理论的图像分割方法,通过K-Means聚类算法实现图像分割或颜色分层处理。基础性文章,希望对你有所帮助。 1.K-Means原理 2.K-Means聚类分割灰度图像 3.K-Means聚类对比分割彩色图像

杨秀璋的专栏 4万+

Java泛型的约束和局限性

在使用Java泛型时需要考虑一些限制, 大多数限制都是由于类型擦除所引起的。

zerods-seu的博客 832

# YOLOv11-seg改进系列 | 引入CVPR MetaFormer的C3k2_PoolingFormerCGLU模块,池化Token混合+CGLU门控MLP

本文引入 CVPR 2022 论文(MetaFormer/PoolFormer)提出的 MetaFormer 元架构设计,以Pooling Token 混合器 + ConvolutionalGLU(CGLU)MLP构成,将其封装为,用于替换 YOLOv11-seg 的 C3k2 块。对比维度C3k2(基线)C3k2_PoolingFormerCGLU(本文)参数量(n scale)2.46M≈2.49M9.6≈9.69.7(+1.0%)架构范式单阶段卷积MetaFormer 双阶段。

qq_44224801的博客 845

Java 泛型 泛型的约束与局限性

不能用基本类型实例化类型参数 不能用类型参数代替基本类型:例如,没有Pair,只有Pair,其原因是类型擦除。擦除之后,Pair类含有Object类型的域,而Object不能存储double值。这体现了Java语言中基本类型的独立状态。 运行时类型查询只适用于原始类型(raw type) 运行时:通常指在Classloader装载之后,JVM执行之时 类型查询:instanceof、getClass、强制类型转换 原始类型:即(raw type),泛型类型经编译器类型擦除后是Object或泛型参数的限定类型

wj1314250的博客 3258

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java-什么是泛型,为什么使用泛型,集合中的泛型使用,自定义泛型类,泛型方法,泛型的使用场景,泛型在继承方面的体现,无边界通配符,上界通配符,下界通配符,泛型的约束与局限性

Java-什么是泛型,为什么使用泛型,集合中的泛型使用,自定义泛型类,泛型方法,泛型的使用场景,泛型在继承方面的体现,无边界通配符,上界通配符,下界通配符,泛型的约束与局限性

H_X_P_的博客 553

假人有限元模型

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

一文带你看懂泛型的约束和局限性

这是因为,定义的equals(T t)方法实际上会被擦拭成equals(Object t),而这个方法是继承自Object的,编译器会阻止一个实际上会变成覆写的泛型方法定义。泛型是一种类似“模板代码”的技术,不同语言的泛型实现方式不一定相同。Java语言的泛型实现方式是。所谓擦拭法是指,虚拟机对泛型其实一无所知,所有的工作都是编译器做的。所以,Java的泛型是由编译器在编译时实行的,编译器内部。,但是,在需要转型的时候,编译器会根据T的类型自动为我们。了解了Java泛型的实现方式——擦拭法,我们就知道了。

weixin_54828627的博客 420

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java泛型(三):类型擦除带来的约束与局限性

上帝给你打开了一扇门,肯定会给你关上另外一扇窗,没有哪种方法是十全十美的。类型擦除机制虽然很好的解决了 JVM 没有泛型类型对象的问题,但同时也引出了一些新的问题。本文将针对这些问题进行详细的讲解。

Ju的博客 663

泛型的局限性,泛型约束

1.不能用类型参数代替基本类型 例如,没有Pair<double>,只有Pair<Double>,其原因是类型擦除。擦除之后,Pair类含有Object类型的域,而Object不能存储double值。这体现了Java语言中基本类型的独立状态。 2.throws或catch泛型类的实例(有关异常) 在Java中,不能对泛型类的异常对象进行抛出捕获。实际上,泛型类继承于Throwable类都是不合法的 3.泛型类的静态上下文中类型变量无效 类的静态域和静态方法是属于类而不属于对

伟大是熬出来的 358

java泛型程序设计——约束与局限性

【0】README0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 约束与局限性 的知识;【1】 不能用基本类型实例化类型参数1.1)不能用类型参数代替基本类型, 因此,没有 Pair 只有 Pair; 1.2)其原因是:类型擦除, 擦除之后, Pair类含有 Object类型的域, 而Object 不能存储double 值;【2】运行

PacosonSWJTU的博客 983

java泛型II-泛型中存在的约束与局限性

java泛型中存在一定的约束和局限性,这些限制的主要原因是java虚拟机中对泛型的处理机制有关,即类型擦除。 1:不能用基本类型实例化类型参数 主要原因就是:类型擦除引起的,ArrayList会被转为Object,但double没有继承object。 如: ArrayList<Double> list=new ArrayList<>();//正确 ArrayList<dou

liuyufeihu的专栏 1372

java泛型约束_Java 基础-泛型的约束和局限性

Java基础-泛型的约束和局限性Java中的泛型是一个非常重要知识点,在这里,简单的介绍一下Java泛型的几个注意点。这里不会讲解Java中的泛型是怎么使用的,只会讲解在Java中使用的泛型的注意点1. 不能使用基本数据类型实例化类型参数不能使用类型参数代替基本数据。因此,没有Pair,只有Pair(这里我们假设Pair是一个public class Pair 类型的一个类)。这个非常的好理解,想...

weixin_36252784的博客 763
下一篇: java编程思想笔记
拓-拓
博客等级 码龄12年 10粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值