java 泛型的类型擦除与桥方法

简介: java 泛型学习java泛型的笔记,详细写明白在学习泛型的过程中的笔记心得等:泛型类泛型方法类型擦除(Type Erasure)桥方法泛型类 代码参考:java核心技术 卷1 第十版public class Pair<T> { private T first; private T second; //

java 泛型

学习java泛型的笔记,详细写明白在学习泛型的过程中的笔记心得等:

  • 泛型类
  • 泛型方法
  • 类型擦除(Type Erasure)
  • 桥方法

泛型类

代码参考:java核心技术 卷1 第十版

public class Pair<T> 
{
  private T first; 
  private T second; 

  //构造器
  public Pair()  { first = null; second = null;} 
  public Pair(T first , T second )  {this.first = first; this.second = second;} 

  //get方法
  public T getFirst()    {return first; } 
  public T getSecond ()    {return second;} 

  //set方法
  public void setFirst(T newValue)  { first =newValue; } 
  public void setSecond (T newValue)   { second = newValue; } 
}

泛型方法

class A
public static <T> T get(T a)
{
    return a;
}

泛型方法可以定义在普通类中,也可定义在泛型类中。

类型擦除(Type Erasure)

以下内容参考自—— [Java泛型与桥方法]

JVM并不知道泛型的存在,因为泛型在编译阶段就已经被处理成普通的类和方法;
处理机制是通过类型擦除,擦除规则:

  • 若泛型类型没有指定具体类型,用Object作为原始类型;
  • 若有限定类型< T exnteds XClass >,使用XClass作为原始类型;
  • 若有多个限定< T exnteds XClass1 & XClass2 >,使用第一个边界类型XClass1作为原始类型;

例如:上述泛型类Pair编译后的结果为

 public class Pair 
 {
    private Object first=null;
    private Object second=null;

    public Pair(Object fir,Object sec) 
     {
         this.first=fir;
         this.second=sec;
     }
   public Object getFirst() 
   {
     return this.first;
   }
   public void setFirst(Object fir) 
   {
        this.first=fir;
   }
}

类型擦擦会带来一些问题,比如当一个类实现了一个参数化的接口或是继承了一个参数化的类时。

class SonPair extends Pair<String> //继承类一个泛型类
 {
     public void setFirst(String fir){....}//重写了父类的方法
 }

Pair在编译的时候已经被类型擦除,Pair的setFirst方法变为了setFirst(Object fir),这样SonPair的setFirst(Stirng fir)方法就无法覆盖父类中的setFirst(Object fir)方法,因为参数不同,不是同一个方法。
如下所示,SonPair中会出现两个方法:

public void setFirst(String fir){....}
public void setFirst(Object fir){....}

那么具体应该调用哪一个方法呢?
为了解决这个问题,jvm引进了桥方法的概念

桥方法

上一节中的两个方法被编译器变成了这样:

public void setFirst(String fir){....} //这里什么都不变

//为该方法添加了一些东西,该方法就被称为“桥方法”
public void setFirst(Object fir) 
{
     setFirst((String) fir);//桥内部调用的是子类中定义的setFirst(String fir)方法
}
目录
相关文章
|
2月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
2月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
101 9
|
3天前
|
存储 Java 索引
Java快速入门之数组、方法
### Java快速入门之数组与方法简介 #### 一、数组 数组是一种容器,用于存储同种数据类型的多个值。定义数组时需指定数据类型,如`int[]`只能存储整数。数组的初始化分为静态和动态两种: - **静态初始化**:直接指定元素,系统自动计算长度,如`int[] arr = {1, 2, 3};` - **动态初始化**:手动指定长度,系统给定默认值,如`int[] arr = new int[3];` 数组访问通过索引完成,索引从0开始,最大索引为`数组.length - 1`。遍历数组常用`for`循环。常见操作包括求和、找最值、统计特定条件元素等。
|
1天前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
28 12
|
2天前
|
算法 Java API
Java 方法注释:规范、实用和高质量的写法
本文深入探讨了如何编写高质量的 Java 方法注释
24 11
|
2天前
|
SQL Java 数据库连接
【潜意识Java】Java中JDBC过时方法的替代方案以及JDBC为什么过时详细分析
本文介绍了JDBC中一些常见过时方法及其替代方案。
21 5
|
2月前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
60 4
|
2月前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
85 4
|
2月前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
32 1
|
3月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
73 17