深入理解JAVA虚拟机 程序编译和代码优化

本文探讨了Java中泛型的工作原理,特别是类型擦除的概念,并通过实例展示了泛型如何影响方法重载。了解这些知识有助于更好地使用泛型并避免潜在的编译错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

泛型类型擦除

C#中的泛型,不论是代码中,还是编译后,还是运行期,都是切实存在的。List<String>和List<Int>是两个截然不同的类型,有自己的虚方法表和类型数据,这种实现称为类型膨胀。

Java中的泛型是编译之后就消失了。只在代码中存在。

当泛型遇见重载

  1. public class OverloadTest {
  2.     public void testType(List<String> list) {
  3.     System.out.println("String....");
  4. }
  5.  
  6. public void testType(List<Integer> list) {
  7.     System.out.println("Integer....");
  8. }
  9. }

这连个方法重载是失败的,但是我们知道java的泛型是伪泛型,编译之后类型都被擦除了,因此这段代码不能通过编译,因为String类型和Integer类型被擦除之后,两个方法是一样的。

  1. public class OverloadTest {
  2.     public String testType(List<String> list) {
  3.     System.out.println("String....");
  4.     return "";
  5. }
  6.  
  7. public int testType(List<Integer> list) {
  8.     System.out.println("Integer....");
  9.     return 1;
  10. }
  11. }

虽然返回值不能作为方法签名,但是这两个方法是可以编译通过的。这是java编译器的特殊处理。因为在class文件格式中,只要描述符不是完全一致的两个方法就可以共存。也就是两个方法如果有相同的名称和特征签名,但是返回值不同它们就可以合法的共存于一个class文件之中。

转载于:https://www.cnblogs.com/xiaolang8762400/p/7103893.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值