泛型中的桥接方法

泛型中的桥接方法

声明一个抽象类

public abstract class BaseMapper<T> {
	public abstract T selectByPrimaryKey(T t);
}

再声明其子类

public class UserMapper extends BaseMapper<User> {
	@Override
	public User selectByPrimaryKey(User user) {
		// 方法体
	}
}

单纯获取子类中声明的方法,会发现子类竟然有两个方法

for (Method method : UserMapper.class.getDeclaredMethods()) {
    System.out.println(method.toGenericString());
    System.out.println(method.isBridge());
}

打印结果如下
public User fool.liyc.liyclearn.basic.genericTest.UserMapper.selectByPrimaryKey()
fasle
public Object fool.liyc.liyclearn.basic.genericTest.UserMapper.selectByPrimaryKey()
true

多出来的第二个方法就是一个桥接方法,会发现生成的class文件里根本没有这个方法,但是却可以打印关于它的日志。

其原理是:

针对于继承泛型类并重写泛型方法的情况

class B extends A<String> {  
    //它就是桥接方法
    Object get(Object s) {  
        return (Object) get((String) s);  
    }  
  
    String get(String s) {  
        return "";  
    }  
} 

如果子类中的方法只有 String get(String s) 方法,那显然并没有完成对父类中T get(T s) 方法的重写,由于泛型擦除,它应该重写成Object get(Object s),否则会因为抽象方法没被重写而报错,但写上又会让开发人员感觉莫名其妙多个个方法。

jdk1.5以后为了解决这个问题,引入了桥接方法的概念,在运行时增加桥接方法用于适配方法重写机制,再隐藏起来让人不可见,所以才会出现"明明子类只声明了一个方法,却能遍历出两个DeclareMethod"的情况。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
泛型的产生条件 泛型是为了解决在编译期间无法确定类型而引入的,其产生条件包括: 1. 在代码需要使用到泛型类型,但是这个泛型类型的具体类型在编译期间是不确定的; 2. 在代码需要对泛型类型进行操作,比如调用其方法或者获取其属性值。 泛型的概念 泛型是指在编写代码时,不需要指定数据类型,而是在使用时再指定具体的数据类型。这样就可以提高代码的复用性和灵活性。 泛型泛型类是指使用泛型定义的类,其泛型参数可以用在类的成员变量、成员方法、构造方法泛型类派生类 泛型类派生类是指使用泛型定义的类的子类,其子类可以继续使用父类定义的泛型类型。 带泛型子类 带泛型子类是指在继承泛型类时,子类也要使用泛型类型。 不带泛型子类 不带泛型子类是指在继承泛型类时,子类不使用泛型类型。 泛型接口 泛型接口是指使用泛型定义的接口,其泛型参数可以用在接口的方法泛型方法 泛型方法是指使用泛型定义的方法,其泛型参数可以用在方法的参数列表、返回值、方法。 类型通配符 类型通配符是指在定义泛型时使用的一种特殊符号,用于表示不确定的类型。 引出类型通配符 类型通配符可以用于引出泛型类型参数的上限或者下限。 类型通配符的上限 类型通配符的上限是指使用 extends 关键字限制泛型类型参数的范围,表示泛型类型参数必须是某个类型的子类或者实现类。 类型通配符的下限 类型通配符的下限是指使用 super 关键字限制泛型类型参数的范围,表示泛型类型参数必须是某个类型的父类或者超类。 类型擦除 类型擦除是指在编译期间,将泛型类型参数替换为其上限或者 Object 类型的过程。 无限制类型的擦除 无限制类型的擦除是指在泛型类型参数没有明确指定上限或者下限时,将其擦除为 Object 类型。 有限制类型擦除 有限制类型擦除是指在泛型类型参数有明确指定上限或者下限时,将其擦除为上限或者下限。 擦除泛型方法类型定义的参数 在泛型方法,如果定义了泛型类型参数,则在编译期间也会进行类型擦除。 桥接方法泛型类或者泛型接口,如果有泛型方法,则在编译期间会自动生成桥接方法来确保类型安全。 泛型数组 泛型数组是指使用泛型定义的数组,其数组元素的类型为泛型类型参数。 泛型与反射 泛型与反射的结合可以实现动态创建泛型类型对象、获取泛型类型信息等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值