廖雪峰Java4反射与泛型-3范型-6super通配符
1.super通配符
1.1super通配符第一种用法
泛型的继承关系
Pair<Integer>不是Pair<Number>的子类,如
static void set(Pair<Integer> p, Integer first, Integer last){...}
set()不接受Pair<Number>
使用<? super Integer>使方法接收所有泛型类型为Integer或Integer超类的Pair类
package com.testArray;
public class PairHepler {
static void set(Pair<? super Integer> p,Integer first,Integer last){
/**
* 对Pair<? super Integer> 调用setFirst()方法:
* 方法签名:void setFirst(? super Integer)
* 可以安全传入Integer类型的变量:p.setFirst(new Integer(123))
*/
p.setFirst(first);
p.setLast(last);
}
static Integer add(Pair<? extends Number> p){
/**
* 对Pair<? super Integer>调用getFirst()方法:
* 方法签名:? super Integer getFirst()
* 无法赋值给Integer类型的变量。因为无法确定返回值就是Integer类型,可以确认其是Integer的超类,但无法确认就是Integer
*/
Number first = p.getFirst();
Number last = p.getLast();
return first.intValue()+last.intValue();
}
}
<? super Integer>的通配符:
* 允许调用set方法传入Integer的引用
* 不允许调用get方法获得Integer的引用
* 唯一例外:可以获取Object引用:Object o = p.getFirst();
void process(List<? super Integer> list){...}
class List<T>{
T.get(int index);//process方法不能调用
void add(T t);//process方法可以调用
void remove(T t);//process方法可以调用
}
1.2super通配符的第二种用法
<T super Integer>的通配符:
限定定义Pair<T>时只能是Integer或Integer的超类
public class Pair<T super Integer>{...}
Pair<Integer> ip = new Pair<>(1, 2);
Pair<Number> np = new Pair<>(1, 2);
Pair<String> sp = new Pair<>("a", "b");//error
2.extends和super的区别
方法参数为<? extends T>和方法参数为<? super T>的区别:
* <? extends T>允许调用方法获取T的引用
* <? super T>允许调用方法传入T的引用
public class Collections{
//把src的每个元素复制到dest中:List<? super T> dest目标,List<? extends T> src源文件
public static <T> void copy(List<? super T> dest, List<? extends T> src){
for(int i=0; i<src.size(); i++){
T t = src.get(i);
dest.add(t);
}
}
}
3.无限定通配符
public class Pair<T> {...}
public class PairHelper{
static boolean isNull(Pair<?> p){
return p.getFirst() == null || p.getLast() == null;
}
}
<?>的通配符:
?号即包括了extends的限制,页包括了super的限制
不允许调用set方法,null除外
只能调用get方法获取Object的引用
因此使用Pair<?>只能获取Object的引用,以及是否为null
Pair<?>和 Pair不同,通常情况下可以引入泛型参数<T>消除<?>通配符
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 String toString(){
return "Pair(" + first+", "+last+")";
}
}
Main.java
package com.testArray;
public class Main {
public static void main(String[] args){
Pair<Integer> p = new Pair<>(0, 0);
System.out.println(p);
set(p, 123, 456);
System.out.println(p);
Pair<Number> n = new Pair<>(1.2,3.4);
System.out.println(n);
set(n,99,88);
System.out.println(n);
}
static void set(Pair<? super Integer> p, Integer first,Integer last){
p.setFirst(first);
p.setLast(last);
//Integer f = p.getFirst();
}
}
4.总结:
使用类似<? super Integer>通配符作为方法参数时表示:
* 方法内部可以调用传入Integer引用的方法:obj.setXXX(Integer n)
* 方法内部无法调用获取Integer引用的方法(Object除外)Integer n = obj.getXxx()
使用类似<T super Integer>定义泛型类时表示:
* 泛型类型限定为Integer或Integer的超类
无限定通配符<?>很少使用,可以用<T>替换
廖雪峰Java4反射与泛型-3范型-6super通配符的更多相关文章
- 廖雪峰Java4反射与泛型-3范型-5extends通配符
1.泛型的继承关系: Pair<Integer>不是Pair<Number>的子类 add()不接受Pair<Integer> Pair.java package ...
- 廖雪峰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 ...
随机推荐
- eclipse + python + pydev
工具:eclipse-nion.jdk8.python3.6.pydev eclipse -> help -> eclipse marketplace -> 输入 python,in ...
- AC自动机自我理解和模板
给出长度为m的文本 查询 n个单词出现的次数 用kmp 复杂度 n*m*(单词平均长度) 用字典树 复杂度 m*每次字典树遍历的平均深度) AC自动机 复杂度 m (思路可以理解为kmp+字典树 ) ...
- 逍遥大佬分享mysql知识
设计表规则: 0),数据库名字以db_开始,编码UTF8 1),表名都以tb_开始 2),字段都是用小写,比如是否删除is_delete 3),表都是innodb,utf8格式的 4),最重要的,表名 ...
- shell dict 操作
shell 读取文件,利用dict 合并第一列 . #!/bin/bash result_file="a" declare -A mydict total=`cat ${resul ...
- YAML Class ID Reference
Classes Ordered by ID Number ID Class 1 GameObject 2 Component 3 LevelGameManager 4 Transform 5 Time ...
- VIM命令操作
退出命令 :wq 保存并退出 ZZ 保存并退出 :q! 强制退出并忽略所有更改 :e! 放弃所有修改,并打开原来文件.
- Spring技术内幕总结 - IoC容器的实现
IoC:Inversion of Control,控制反转,即依赖对象的获得被反转了(DI:dependency inversion,依赖注入)在Spring中,IoC容器是实现这个模式的载体.它可以 ...
- mongodb之 3.4.0 mongodb sharing 副本集群搭建
系统系统 centos6.5三台服务器:10.100.25.42/43/44安装包: mongodb-linux-x86_64-rhel62-3.4.0.tgz 服务器规划:mongos mongos ...
- 单节点 Elasticsearch 出现 unassigned shards 原因及解决办法
根本原因: 是因为集群存在没有启用的副本分片,我们先来看一下官网给出的副本分片的介绍: 副本分片的主要目的就是为了故障转移,正如在 集群内的原理 中讨论的:如果持有主分片的节点挂掉了,一个副本分片就会 ...
- checkbox复选框,如何让其勾选时触发一个事件,取消勾选时不触发
<input type="checkbox" onclick="checkboxOnclick(this)" /> <script> f ...