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文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
84 9
|
2月前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
47 4
|
2月前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
55 4
|
2月前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
27 1
|
3月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
62 17
|
2月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
137 4
|
2月前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
泛型擦除是指Java编译器在编译期间会移除所有泛型信息,使所有泛型类型在运行时都变为原始类型。例如,`List&lt;String&gt;` 和 `List&lt;Integer&gt;` 在JVM中都视为 `List`。因此,通过 `getClass()` 比较两个不同泛型类型的 `ArrayList` 实例会返回 `true`。此外,通过反射调用 `add` 方法可以向 `ArrayList&lt;Integer&gt;` 中添加字符串,进一步证明了泛型信息在运行时被擦除。
50 2
|
2月前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
299 2
|
3月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
41 3