廖雪峰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 ...
随机推荐
- 小米4c刷LineageOS
注意,本文仅限于小米4c,其他手机仅可参考步骤.如下rom,su,gapps包的下载都是小米4c的,深刷miflash也仅适用于小米手机.准备工作:请自行备份好手机内的个人资料. 电脑环境,usb驱动 ...
- hdu6441 Find Integer (费马大定理)
#include<bits/stdc++.h> using namespace std; int main() { int T; scanf("%d",&T); ...
- functional program language
1.什么是函数式编程语言 函数式语言(functional language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型.这种语言具有较强的组 ...
- 后端程序猿怎能不会的linux命令
(图片超清,可放大网页查看) 来源 https://zhuanlan.zhihu.com/p/28674639
- UWA 转载
性能优化,进无止境-内存篇 https://blog.uwa4d.com/archives/optimzation_memory_1.html https://blog.uwa4d.com/archi ...
- Autofac学习之三种生命周期:InstancePerLifetimeScope、SingleInstance、InstancePerDependency 【转载】
InstancePerLifetimeScope:同一个Lifetime生成的对象是同一个实例 SingleInstance:单例模式,每次调用,都会使用同一个实例化的对象:每次都用同一个对象: In ...
- C#中Socket关闭 Close、Dispose、Shutdown、Disconnect
An answer on StackOverflow made me think I have finally reached some glimpse of an understanding. Th ...
- Flex Cairngorm框架知识整理
简介: Cairngorm是一个开源的Flex项目,为FLex提供了一个类似MVC的体系结构框架,它是Flex RIA开发的最好框架之一.使用Cairngorm框架可以大大提高开发和维护的效率. Ca ...
- ipset可使iptables一次性封多个ip
ipset是什么? ipset是iptables的扩展,它允许你创建 匹配整个地址集合的规则.而不像普通的iptables链只能单IP匹配, ip集合存储在带索引的数据结构中,这种结构即时集合比较大也 ...
- 相似度与距离计算python代码实现
#定义几种距离计算函数 #更高效的方式为把得分向量化之后使用scipy中定义的distance方法 from math import sqrt def euclidean_dis(rating1, r ...