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. #505 1&2 A-C 后面未完成

    A. Doggo Recoloring 题目意思是给一个字符串(都是小写字母),如果有两个字符相同,我们可以将这两个字符变成其他字符,问能不能使字符串字母都一样 思路  有两个相同字符时就能:  字符 ...

  2. Go Example--接口

    package main import ( "math" "fmt" ) type geometry interface { area() float64 pe ...

  3. Python知识点整理,基础5 - 文件操作

  4. 从 Godaddy 转移域名到 Namesilo

    域名本来是在 Godaddy 上注册的,首付很便宜,但是续费时发现是个坑,续费一年是 102 元,再加上隐私保护 60元/年,总共一年需要 160 元,续费贵而且一点优惠也没. 对比下其他商家一年只要 ...

  5. 日志信息log

    #include<syslog.h> //建立一个到系统日志的连接 //ident参数指向字符串,syslog()输出的每条信息都会包含这个字符串,这个参数的取值通常是程序名 //log_ ...

  6. MySQL Transaction--TPS计算规则

    TPS计算规则 在MYSQL 中,TPS(Transaction Per Second)的计算方法为 (com_commit+com_rollback)/time,但com_commit和com_ro ...

  7. lapis 项目添加prometheus 监控

      lapis 是基于openresty 扩展的,所以直接将支持prometheus的模块构建进openresty 就可以了 我使用的是nginx-module-vts 模块 环境准备 我已经构建好了 ...

  8. Stream processing with Apache Flink and Minio

    转自:https://blog.minio.io/stream-processing-with-apache-flink-and-minio-10da85590787 Modern technolog ...

  9. zabbix--3.0--1

    实验环境 实验用2到2台机器,实验所用机器系统环境如下,可以看到2台机器的主机名和IP地址 [root@linux-node1 ~]# cat /etc/redhat-release CentOS L ...

  10. 20165308 预备作业3 Linux安装及学习

    Linux安装及学习 Linux的安装 因为做的比较晚, 安装过程按照老师给出的步骤和同学指导并未出现很多问题,只是安装VirtualBox虚拟机增强功能时,代码没输正确,结果一直无法正确安装,后来也 ...