散装java 散装java
首页
  • Java基础
  • JVM
  • Java多线程
  • 知识点
  • 案例
  • Redis
  • RabbitMQ
  • Kafka
  • Elasticsearch
  • MySQL
  • Linux
  • Docker
  • Zookeeper
  • Nginx
  • Git
  • JMeter
  • Gradle
  • 常见BUG
  • 常见解决方案
  • 资源
  • 问答
💖支持
Gitee (opens new window)
首页
  • Java基础
  • JVM
  • Java多线程
  • 知识点
  • 案例
  • Redis
  • RabbitMQ
  • Kafka
  • Elasticsearch
  • MySQL
  • Linux
  • Docker
  • Zookeeper
  • Nginx
  • Git
  • JMeter
  • Gradle
  • 常见BUG
  • 常见解决方案
  • 资源
  • 问答
💖支持
Gitee (opens new window)
  • Java基础

    • Java 基础导读
    • Java 中运算符的优先级
    • 泛型

      • 什么是泛型擦除
      • 什么是泛型的桥方法
        • 什么是泛型的桥方法
        • 举例说明
      • 泛型通配符以及边界
  • Java集合

    • ArrayList
    • LinkedList
    • HashMap
  • Java并发-JUC

  • JVM

    • 什么是JVM
    • JVM的组成及其作用
    • 类加载机制&双亲委派
  • Java多线程

    • 多线程导读
  • Java
  • Java基础
  • 泛型
散装java
2022-11-27
目录

什么是泛型的桥方法

# 什么是泛型的桥方法

桥接方法(Bridge Method)用于继承或者实现泛型类时保证多态性。

因为泛型在编译后会背擦除,所以才会有桥方法。

注意:桥方法是编译器自动生成的非手写

# 举例说明

public class GenericBridgeTest {
    public static void main(String[] args) {
        Class<DemoServiceImpl> demoClass = DemoServiceImpl.class;
        Method[] methods = demoClass.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method.getName() + ":" + method.getReturnType());
        }
    }
}

interface DemoService<T> {
    T getData();
}

class DemoServiceImpl implements DemoService<Integer> {
    @Override
    public Integer getData() {
        return Integer.MAX_VALUE;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

此时的输出为

getData:class java.lang.Integer
getData:class java.lang.Object
1
2

这里呢,我们会发现DemoServiceImpl类多了一个返回值类型是Object的getData方法,这就是桥方法

其实就相当于,在程序运行的过程中DemoServiceImpl类是下面这个样子

class DemoServiceImpl implements DemoService<Integer> {
    @Override
    public Integer getData() {
        return Integer.MAX_VALUE;
    }

    // public Object getData() 是编译器自动生成的
    // 这里如果你手动写上下面方法会出下面下面异常
    // 'getData()' is already defined in 'com.bulk.generic.DemoServiceImpl'
    public Object getData() {
        return Integer.MAX_VALUE;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

interface DemoService<T> 在泛型擦除后,其实会变成interface DemoService<Object>,对应的T getData();方法也会转变为Obejct getData();。而且在其实现类中并没有重写该方法,所以编译器会自动在其实现类 DemoServiceImpl 中,自动生成桥方法Object getData()。

上次更新: 2022/11/27, 16:23:17
什么是泛型擦除
泛型通配符以及边界

← 什么是泛型擦除 泛型通配符以及边界→

Theme by Vdoing | Copyright © 2022-2024 散装java | MIT License | 鲁ICP备2022022143号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式