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)方法
}
目录
相关文章
|
14天前
|
Java
Java——方法的引用
方法引用允许将已有方法作为函数式接口的实现。使用“::”符号,需具备函数式接口,被引用的方法须存在且参数和返回值需与抽象方法一致。其分类包括:静态方法引用(类::方法名)、成员方法引用(对象::方法名、this::方法名、super::方法名)和构造方法引用(类名::new)。方法引用提高了代码的简洁性和可读性,减少了样板代码。
29 13
Java——方法的引用
|
10天前
|
Java
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
本文介绍了Java中抽象类和抽象方法的使用,以及ArrayList的基本操作,包括添加、获取、删除元素和判断列表是否为空。
13 2
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
|
18天前
|
Java 编译器 容器
Java——包装类和泛型
包装类是Java中一种特殊类,用于将基本数据类型(如 `int`、`double`、`char` 等)封装成对象。这样做可以利用对象的特性和方法。Java 提供了八种基本数据类型的包装类:`Integer` (`int`)、`Double` (`double`)、`Byte` (`byte`)、`Short` (`short`)、`Long` (`long`)、`Float` (`float`)、`Character` (`char`) 和 `Boolean` (`boolean`)。包装类可以通过 `valueOf()` 方法或自动装箱/拆箱机制创建。
25 9
Java——包装类和泛型
|
21天前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
7天前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
18 4
|
9天前
|
安全 Java API
Java根据URL获取文件内容的实现方法
此示例展示了如何安全、有效地根据URL获取文件内容。它不仅展现了处理网络资源的基本技巧,还体现了良好的异常处理实践。在实际开发中,根据项目需求,你可能还需要添加额外的功能,如设置连接超时、处理HTTP响应码等。
44 4
|
15天前
|
Java API
Java方法的优缺点
Java 方法是编程的基本构建块,具有代码重用性、模块化、易于调试、增强可读性、支持重载和可变参数、封装性及静态与实例方法的灵活性等优点,但也存在性能开销、过度抽象、限制使用环境、参数传递开销、命名冲突和堆栈溢出等缺点。合理设计方法可确保代码高效且易维护。
|
10天前
|
安全 Java
java调用方法
java调用方法
18 4
|
15天前
|
Java
Java的方法详解
在 Java 中,方法是执行特定任务的代码块,包括定义、参数传递、返回值处理及重载等功能。
|
18天前
|
存储 安全 搜索推荐
Java中的泛型
【9月更文挑战第15天】在 Java 中,泛型是一种编译时类型检查机制,通过使用类型参数提升代码的安全性和重用性。其主要作用包括类型安全,避免运行时类型转换错误,以及代码重用,允许编写通用逻辑。泛型通过尖括号 `&lt;&gt;` 定义类型参数,并支持上界和下界限定,以及无界和有界通配符。使用泛型需注意类型擦除、无法创建泛型数组及基本数据类型的限制。泛型显著提高了代码的安全性和灵活性。
下一篇
无影云桌面