java利用泛型写通讯录_廖雪峰Java4反射与泛型-3范型-5extends通配符

1.泛型的继承关系:

Pair不是Pair的子类

add()不接受Pair

Pair.java

package com.testArray;

public class Pair {

private T first;

private T last;

public Pair(T first,T last){

this.first = first;

this.last = last;

}

public void setFirst(T first){

this.first = first;

}

public T getFirst() {

return first;

}

public void setLast(T last){

this.last = last;

}

public T getLast(){

return last;

}

}

public class PairHepler {

static int add(Pair p){

Number first = p.getFirst();

Number last = p.getLast();

return first.intValue() + last.intValue();

}

}

a47f9101683d1c54327573e6c542bd41.png

2.extends通配符

2.1extends通配符的第一种用法

如果想要add接收Pair.Integer、Pair.Float、Pair.Double,将Pair类型修改为 extends Number>使方法接收所有泛类型为Number或Number子类的Pair类。

package com.testArray;

public class PairHepler {

static int add(Pair extends Number> p){

Number first = p.getFirst();

Number last = p.getLast();

return first.intValue() + last.intValue();

}

}

a79cef65bb2df43028f648ceeaa0e2c8.png ```#log 1.对Pair extends Number>调用getFirst()方法: 方法签名:?extends Number getFirst() 可以安全赋值给Number类型的变量:Number x = p.getFirst() 不可预测实际类型就是Integer:Integer x = p.getFirst();会报错,必须用Number 2.对Pair extends Number>调用setFirst()方法: 方法签名:void setFirst(? extends Number) 无法传递任何Number类型给setFirst(? extends Number) 3.因此 extends Number>的通配符: 允许调用get方法获得Number的引用 不允许调用set方法传入Number的引用 唯一例外:可以调用setFirst(null) ``` ```#java package com.testArray;

public class PairHepler { static int add(Pair extends Number> p){ Number first = p.getFirst(); Number last = p.getLast(); p.setFirst(null); p.getFirst(); return first.intValue() + last.intValue(); /** * 但不能预测实际类型就是Integer: * Integer x = p.getFirst(); * void setFirst(? extends Number) * 无法传递任何Number类型给setFirst(? extends Number) */ } }

### 2.2extends通配符的第二种用法

```#log

定义泛型类是public class Pair{}:

限定T只能是Number或Number的子类

public class Pair{...}

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

Pair dp = new Pair<>(1.2, 3.4);

Pair sp = new Pair<>('a', 'b');//error

3.总结:

使用类似 extends Number>通配符作为方法参数时表示: * 方法内部可以调用获取Number引用的方法: n = obj.getXXX() * 方法内部无法调用传入Number应用的方法,null除外:obj.setXX(Number n)

使用类似定义泛型类时表示: * 泛型类型限定为Number或Number的子类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值