java教程——泛型,mysql主从复制原理面试

public selfMap(T one, T two) {

this.one = one;

this.two = two;

}

public T getOne(){

return one;

}

public T getTwo(){

return two;

}

}

你一眼望去可能真看不出有什么区别,可是你细细一看,就会发现我们把 add(selfMap selfMap) 改成了 add(selfMap<? extends Number> selfMap)

也就是说解决问题的关键在于这么一句申明 <? extends Number> 那它到底是什么呢?

这种使用 <? extends Number> 的泛型定义称之为上界通配符(Upper Bounds Wildcards),即把泛型类型  T 的上界限定在Number了。

除了可以传入 Pair<Integer> 类型,我们还可以传入 Pair<Double> 类型,Pair<BigDecimal> 类型等等,因为 Double 和 BigDecimal 都是 Number 的子类。

问题二我们算是解决了,可是问题一我们能解决吗?答案是不可以写成 Number 的子类的,因为你可以传进来的类型太多了,编译器只能确定类型一定是Number的子类(包括Number类型本身),但具体类型无法确定。

Set方法的调用

========

我们把 class selfMap 完善一下,写两个 set 方法玩一下,如下:

class selfMap{

private T one;

private T two;

public selfMap(T one, T two) {

this.one = one;

this.two = two;

}

public T getOne(){

return one;

}

public T getTwo(){

return two;

}

public void setOne(T one) {

this.one = one;

}

public void setTwo(T two) {

this.two = two;

}

}

这个时候我们就可以 调用 里面的 set 方法了,当我们 在 add(selfMap<? extends Number> selfMap) 方法里传入的是 selfMap<? extends Number> selfMap 类型的参数时,根据 “擦试法” 我们可以 明白 真正的 set 方法的写法:

setOne(? extends Number one)

也就是说他需要你传一个 ? extends Number 类型的参数,有人说这个简单啊,不就是 Number 的子类吗?,其实不然,简单来解释还是那个原因:Number子类很多啊,如何保证安全的类型转换呢?很难,所以啊,<? extends Number>通配符的一个重要限制:方法参数签名 setOne(? extends Number)无法传递任何Number类型及其子类型给setOne(? extends Number)。简单点说就是 :你把 ? extends Number``当做泛型T传入会导致该类的set方法不方便调用。

因此,方法参数类型SelfMap<? extends Number>表明了该方法内部只会读取SelfMap的元素,不会修改SelfMap的元素(因为无法调用setOne(? extends Number)方法。换句话说,这是一个对参数SelfMap<? extends Number>进行只读的方法(恶意调用setOne(null)除外)。

使用extends限定T类型

在定义泛型类型Pair<T>的时候,也可以使用extends通配符来限定T的类型:

public class Pair { … }

现在,我们只能定义:

Pair p1 = null;

Pair p2 = new Pair<>(1, 2);

Pair p3 = null;

因为NumberIntegerDouble都符合<T extends Number>

Number类型将无法通过编译:

Pair p1 = null; // compile error!

Pair p2 = null; // compile error!

因为StringObject都不符合<T extends Number>,因为它们不是Number类型或Number的子类。

小结

最后

面试题文档来啦,内容很多,485页!

由于笔记的内容太多,没办法全部展示出来,下面只截取部分内容展示。

1111道Java工程师必问面试题

MyBatis 27题 + ZooKeeper 25题 + Dubbo 30题:

Elasticsearch 24 题 +Memcached + Redis 40题:

Spring 26 题+ 微服务 27题+ Linux 45题:

![](https://upload-images.jianshu.io/upload_images/22932333-453cac4daf339a04.png?imageMogr2/auto-orient/strip%7Cima 需要zi料+ 绿色徽【vip1024b】

geView2/2/w/1240)

Java面试题合集:

![](https://upload-images.jianshu.io/upload_images/22932333-453cac4daf339a04.png?imageMogr2/auto-orient/strip%7Cima 需要zi料+ 绿色徽【vip1024b】

geView2/2/w/1240)

Java面试题合集:

[外链图片转存中…(img-arle0Jiy-1710356232218)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值