美文网首页
泛型桥接方法验证

泛型桥接方法验证

作者: _Yuck | 来源:发表于2019-11-27 14:15 被阅读0次

简单验证

public interface SuperClass<T> {
    public T Apply(T t) ;
}


public class SonClass implements SuperClass<String> {

    public String Apply(String str) {
        return str;
    }
}

运行javap -c -v SuperClass.class SonClass.class查看编译后的结果 可以看到SonClass额外生成了一个Object Apply (Object obj)的桥接方法

.
.
.
{
  public abstract T Apply(T);
    descriptor: (Ljava/lang/Object;)Ljava/lang/Object;
    flags: ACC_PUBLIC, ACC_ABSTRACT
    MethodParameters:
      Name                           Flags
      t
    Signature: #8                           // (TT;)TT;
}
Signature: #9                           // <T:Ljava/lang/Object;>Ljava/lang/Object;
SourceFile: "SuperClass.java"


.
.
.
{
  public com.example.bridge.demo.SonClass();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 6: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/example/bridge/demo/SonClass;

  public java.lang.String Apply(java.lang.String);
    descriptor: (Ljava/lang/String;)Ljava/lang/String;
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=2, args_size=2
         0: aload_1
         1: areturn
      LineNumberTable:
        line 9: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       2     0  this   Lcom/example/bridge/demo/SonClass;
            0       2     1   str   Ljava/lang/String;
    MethodParameters:
      Name                           Flags
      str

  public java.lang.Object Apply(java.lang.Object);
    descriptor: (Ljava/lang/Object;)Ljava/lang/Object;
    flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: aload_1
         2: checkcast     #2                  // class java/lang/String
         5: invokevirtual #3                  // Method Apply:(Ljava/lang/String;)Ljava/lang/String;
         8: areturn
      LineNumberTable:
        line 6: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       9     0  this   Lcom/example/bridge/demo/SonClass;
    MethodParameters:
      Name                           Flags
      str                            synthetic
}
Signature: #21                          // Ljava/lang/Object;Lcom/example/bridge/demo/SuperClass<Ljava/lang/String;>;
SourceFile: "SonClass.java"

分析

我们都知道JAVA泛型并不是真正的泛型,在编译完成后泛型会被擦除,变成Object。如果没有桥接方法,编译完成后其实子类并没有实现父类方法。所以为了语义,编译器会自动生成桥接方法,来保证兼容性。

相关文章

  • 泛型桥接方法验证

    简单验证 运行javap -c -v SuperClass.class SonClass.class查看编译后的结...

  • Java 泛型

    泛型类 例如 泛型接口 例如 泛型通配符 泛型方法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型上下边...

  • 泛型的使用

    泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法 泛型类 泛型接口 泛型通配符 泛型方法 静态方法与...

  • Java泛型

    泛型有三种实现方式,分别是泛型接口、泛型类、泛型方法。下面通过泛型方法来介绍什么是类型参数。 泛型方法声明方式:访...

  • 重走安卓进阶路——泛型

    ps.原来的标题 为什么我们需要泛型? 泛型类、泛型接口和泛型方法(泛型类和泛型接口的定义与泛型方法辨析); 如何...

  • JAVA泛型

    泛型方法 泛型类

  • 三泛型的使用

    1.泛型类和泛型方法 (1)格式 (2)示例例如a.泛型类 b.实现方法 2.泛型接口和泛型方法 (1)格式 (2...

  • 泛型

    一、泛型类、泛型接口和泛型方法1、泛型接口的定义: 2、两种泛型类的定义:(1) (2) 3、泛型方法的定义,可以...

  • 泛型 & 注解 & Log4J日志组件

    掌握的知识 : 基本用法、泛型擦除、泛型类/泛型方法/泛型接口、泛型关键字、反射泛型(案例) 泛型 概述 : 泛型...

  • JAVA学习进阶 - 你没有见过的JAVA桥方法

    本文主要介绍:编译器处理泛型方法和多态冲突的处理手段,桥方法本文适合对象:想进一步理解JAVA中泛型机制的进阶玩家...

网友评论

      本文标题:泛型桥接方法验证

      本文链接:https://www.haomeiwen.com/subject/tiepwctx.html