早期用Object表示任意类型,在编码期就不会报错。
问题:但当使用向下强转,出现类型不一致时,运行期就会报错。
解决:所以在JDK1.5引入了泛型,直接在编码期限制类型,主要用于集合中。
//泛型派生子类:子类暂不明确类型就BaseMapper<T> extends Mapper<T>,
// 明确就OrderMapper extends BaseMapper<Order>
public interface BaseMapper<T> extends Mapper<T> {
private T entity;
int insert(T entity);
T selectById(Serializable id);
//类型通配符:如List<?>,表示元素未知,所以只能添加null。没泛型好用,但是适用上下限
//上限:<? extends Serializable>,允许该类及其子类
//下限:<? super Serializable>,允许该类及其父类
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
T selectOne(@Param("ew") Wrapper<T> queryWrapper);
}
JDK1.5出现泛型,为了兼容以前的代码。对于带有泛型的类,在编译之后用Object来代替,生成的Class字节码文件不会出现泛型信息,这个过程叫做类型擦除。
但是新的问题又出现了,看编辑之后的代码,子类重写的方法的方法签名已经和父类不一致了,那么@Override就会报错。
所以JDK1.5引入泛型之后,为了兼容泛型编译的字节码和JDK1.5之前的,就使用了桥接方法。就是再写一个方法,去强转类型
所以,当我们去获取类中的方法时,会有2个。使用method.isBridge()可以判断是否为桥接方法。