廖雪峰Java4反射与泛型-3范型-5extends通配符
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通配符的更多相关文章
- 廖雪峰Java4反射与泛型-3范型-6super通配符
1.super通配符 1.1super通配符第一种用法 泛型的继承关系 Pair<Integer>不是Pair<Number>的子类,如 static void set(Pai ...
- 廖雪峰Java4反射与泛型-3范型-4擦拭法
1.擦拭法是Java泛型的实现方式. 编译器把类型视为Object. * 泛型代码编译的时候,编译器实际上把所有的泛型类型T统一视为Object类型.换句话说,虚拟机对泛型一无所知,所有的工作都是编译 ...
- 廖雪峰Java4反射与泛型-3范型-3编写泛型
编写泛型类比普通的类要麻烦,而且很少编写泛型类. 1.编写一个泛型类: 按照某种类型(例如String)编写类 标记所有的特定类型例如String 把特定类型替换为T,并申明 Pair.java pa ...
- 廖雪峰Java4反射与泛型-3泛型-7泛型和反射
1.部分反射API是泛型 1.1获取反射API的泛型 部分反射API是泛型,如Class<T>是泛型 //如果使用Class,不带泛型,出现compile warning编译警告 Clas ...
- 廖雪峰Java4反射与泛型-2注解-3处理注解
1.处理注解 注解本身对对代码逻辑没有任何影响 SOURCE类型的注解在编译期就被丢掉了 CLASS类型的注解仅保存在class文件中 RUNTIME类型的注解在运行期可以被读取 如何使用注解由工具决 ...
- 廖雪峰Java4反射与泛型-1反射-2访问字段Field和3调用方法Method
2.字段Field 2.1.通过Class实例获取字段field信息: getField(name): 获取某个public的field,包括父类 getDeclaredField(name): 获取 ...
- 廖雪峰Java4反射与泛型-1反射-1Class类
1.Class类与反射定义 Class类本身是一种数据类型(Type),class/interface的数据类型是Class,JVM为每个加载的class创建了唯一的Class实例. Class实例包 ...
- 廖雪峰Java4反射与泛型-2注解-2定义注解
1.定义注解 使用@interface定义注解Annotation 注解的参数类似无参数方法 可以设定一个默认值(推荐) 把最常用的参数命名为value(推荐) 2.元注解 2.1Target使用方式 ...
- 廖雪峰Java4反射与泛型-2注解-1使用注解
1.Annotation定义 注解是放在Java源码的类.方法.字段.参数前的一种标签.如下 package com.reflection; import org.apache.logging.log ...
随机推荐
- jsp中引入jquery报错:Failed to load resource: the server responded with a status of 404 (Not Found)
问题描述: 今天自己在搭建spring.springMVC.hibernate框架,搭建完成后,在引入jquery时,发现jquery不管用.我的解决顺序是: 1.检查路径,发现路径没错,另外需要注意 ...
- linux----CenterOS7中在线安装jdk
summary: 一直以来,都在windows上玩java,今天是一个具有里程碑的一天,感觉正式踏入进入了linux大门. 原来一直以为在linux上安装jdk,需要去官网下载适合linux的jdk, ...
- js动态加载数据并合并单元格
js动态加载数据合并单元格, 代码如下所示,可复制直接运行: <!DOCTYPE HTML> <html lang="en-US"> <head> ...
- maven项目eclipse目录结构浅析
maven项目eclipse目录结构浅析 PS:Java Resources是为了方便我们编译,到最后都会编译到 WEB-INF/classes Maven项目的目录结构
- 每天进步一点点-序列化和反序列(将对象写入硬盘文件and从硬盘文件读出对象)
一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象.所谓“对象序列化”: 简单一句话:使用它可以象存储文本或者数字一样简单的存储对象.一个应用是,程序在执行过程中突 ...
- 初等数论及其应用 (第6版) (Kenneth H.Rosen 著)
第1章 整数 1.1 数和序列 1.2 和与积 1.3 数学归纳法 1.4 斐波那契数 1.5 整除性 第2章 整数的表示法和运算 2.1 整数的表示法 2.2 整数的计算机运算 2.3 整数运算的复 ...
- day10 内容大纲
01 去年内容回顾 01 去年内容回顾 *args **kwargs: 万能参数,动态参数 * 魔性用法: 函数的定义时,* ** 聚合. 函数的执行时,* ** 打散. 形参顺序: 位置参数,*ar ...
- OSGI基础知识整理
一. 简介: OSGi(Open Service Gateway Initiative)技术是面向Java的动态模型系统. OSGi的主要职责就是为了让开发者能够创建动态化.模 ...
- Java集合整理
0,基础概念 Collection:统计大小.插入或删除数据.清空.是否包含某条数据,等等.而Collection就是对这些常用操作进行提取,只是其很全面.很通用.size(),isEmpty(),c ...
- OpenGL纹理
如果不用头文件,把所有东西堆在同一个cpp文件中,会出现“超出GPU内存的错误!” 1 //我们自己的着色器类 #ifndef SHADER_H #define SHADER_H #include & ...