1.泛型的继承关系:

    Pair<Integer>不是Pair<Number>的子类
add()不接受Pair<Integer>

Pair.java

package com.testArray;

public class Pair<T> {
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<Number> p){
Number first = p.getFirst();
Number last = p.getLast();
return first.intValue() + last.intValue();
}
}

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(); }
}


```#log
1.对Pair调用getFirst()方法:
方法签名:?extends Number getFirst()
可以安全赋值给Number类型的变量:Number x = p.getFirst()
不可预测实际类型就是Integer:Integer x = p.getFirst();会报错,必须用Number
2.对Pair调用setFirst()方法:
方法签名:void setFirst(? extends Number)
无法传递任何Number类型给setFirst(? extends Number)
3.因此的通配符:
允许调用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 extends Number>{}:
限定T只能是Number或Number的子类
public class Pair<T extends Number>{...}
Pair<Number> ip = new Pair<>(1, 2);
Pair<Double> dp = new Pair<>(1.2, 3.4);
Pair<String> sp = new Pair<>('a', 'b');//error

3.总结:

  • 使用类似<? extends Number>通配符作为方法参数时表示:

    * 方法内部可以调用获取Number引用的方法: n = obj.getXXX()

    * 方法内部无法调用传入Number应用的方法,null除外:obj.setXX(Number n)
  • 使用类似定义泛型类时表示:

    * 泛型类型限定为Number或Number的子类

廖雪峰Java4反射与泛型-3范型-5extends通配符的更多相关文章

  1. 廖雪峰Java4反射与泛型-3范型-6super通配符

    1.super通配符 1.1super通配符第一种用法 泛型的继承关系 Pair<Integer>不是Pair<Number>的子类,如 static void set(Pai ...

  2. 廖雪峰Java4反射与泛型-3范型-4擦拭法

    1.擦拭法是Java泛型的实现方式. 编译器把类型视为Object. * 泛型代码编译的时候,编译器实际上把所有的泛型类型T统一视为Object类型.换句话说,虚拟机对泛型一无所知,所有的工作都是编译 ...

  3. 廖雪峰Java4反射与泛型-3范型-3编写泛型

    编写泛型类比普通的类要麻烦,而且很少编写泛型类. 1.编写一个泛型类: 按照某种类型(例如String)编写类 标记所有的特定类型例如String 把特定类型替换为T,并申明 Pair.java pa ...

  4. 廖雪峰Java4反射与泛型-3泛型-7泛型和反射

    1.部分反射API是泛型 1.1获取反射API的泛型 部分反射API是泛型,如Class<T>是泛型 //如果使用Class,不带泛型,出现compile warning编译警告 Clas ...

  5. 廖雪峰Java4反射与泛型-2注解-3处理注解

    1.处理注解 注解本身对对代码逻辑没有任何影响 SOURCE类型的注解在编译期就被丢掉了 CLASS类型的注解仅保存在class文件中 RUNTIME类型的注解在运行期可以被读取 如何使用注解由工具决 ...

  6. 廖雪峰Java4反射与泛型-1反射-2访问字段Field和3调用方法Method

    2.字段Field 2.1.通过Class实例获取字段field信息: getField(name): 获取某个public的field,包括父类 getDeclaredField(name): 获取 ...

  7. 廖雪峰Java4反射与泛型-1反射-1Class类

    1.Class类与反射定义 Class类本身是一种数据类型(Type),class/interface的数据类型是Class,JVM为每个加载的class创建了唯一的Class实例. Class实例包 ...

  8. 廖雪峰Java4反射与泛型-2注解-2定义注解

    1.定义注解 使用@interface定义注解Annotation 注解的参数类似无参数方法 可以设定一个默认值(推荐) 把最常用的参数命名为value(推荐) 2.元注解 2.1Target使用方式 ...

  9. 廖雪峰Java4反射与泛型-2注解-1使用注解

    1.Annotation定义 注解是放在Java源码的类.方法.字段.参数前的一种标签.如下 package com.reflection; import org.apache.logging.log ...

随机推荐

  1. rest-framework之频率控制

    rest-framework之频率控制 本文目录 一 频率简介 二 自定义频率类,自定义频率规则 三 内置频率类及局部使用 四 内置频率类及全局使用 五 源码分析 回到目录 一 频率简介 为了控制用户 ...

  2. 20165313 《Java程序设计》第六周学习总结

    教材学习总结 一点浅见,不足之处还请谅解. 正则表达式:正则表达式是一个String对象的字符序列,该字符序列中含有具有特殊意义的字符,这些特殊字符称作正则表达式的元字符. 链表:由若干个称作结点的对 ...

  3. css与html 与js的基础语法

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Sample_2-23456.a ...

  4. {python}完成完整的温度转换程序 猜数字游戏(猜价格,猜年龄等) 解析身份证号、学号不同片段的含义

    完成完整的温度转换程序 while True: a = int(input("如果是华氏转摄氏,请按1\n,如果是摄氏转华氏,请按2\n")) if a==1: h = float ...

  5. Go Example--打点器

    package main import ( "time" "fmt" ) func main() { // 定时器 是当你想要在未来某一刻执行一次时使用的 - ...

  6. (惊艳)对象序列化和反序列--Hibernate的查询和新增极其相似

    Hibernate几个关键字持久化,ORM(关系对象映射)(数据库中关系称作是一张表) 应用在项目中,刘一从写的查询代码,每次都挂掉,想要弄出测试数据,自己想着把查询出来的复杂数据弄到文件里自己要是去 ...

  7. Commons工具包的使用

    使用步骤: 1.Java  Project下新建Folder文件夹,命名lib 2.lib文件夹下把Commons-io-2.4jar包复制进去 3.右键Commons-io-2.4jar包,点击Bu ...

  8. minio 对于压缩的处理

    我们可以简单的配置就可以让minio 支持数据压缩了,这个对于减少带宽的请求,以及web 端的优化很有意义 配置说明 配置文件 "compress": { "enable ...

  9. ipfs docker 运行试用

    ipfs 是一个分布式,p2p 的文件系统,参考了git.bt.sfs 以及web 的设计 环境准备 docker-compose 文件 version: "3" services ...

  10. Big-endian/Little-endian, LSB/MSB

    Least significant byte (LSB) Most significant byte (MSB) Big-endian machines store the most-signific ...