廖雪峰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 ...
随机推荐
- python django day 2
django-admin.py startproject zqxt_viewscd zqxt_viewspython manage.py startapp calczqxt_views/urls.py ...
- 20165313Java实验四 Android程序设计
实验报告封面 课程:Java程序设计 班级:1653班 姓名:张晨晖 学号:20165313 指导教师:娄嘉鹏 实验日期:2018年5月14日 实验时间:13:45 - 15:25 实验序号:实验四 ...
- linux磁盘检测和修复
显示磁盘和闪存的信息,以及分区信息 [root@bogon shell]# fdisk -l Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 s ...
- Coding kata: get the top two teams in one group
In this week, we did a coding kata, the subject is to select the top two teams of football group mat ...
- 02HDFS架构
https://www.cnblogs.com/zhoujingyu/p/5040957.html https://blog.csdn.net/firstchange/article/details/ ...
- SVN提交强制输入日志信息
在团队开发时,因一些团队成员提交代码时没有写提交说明的习惯,为了规范版本管理,增强大家的团队意识,上网找到了强制录入提交日志的方法.方法如下: 一.编写bat文件,命名为pre-commit.bat, ...
- C语言面试题1
1.分析下面代码有什么问题? 1 2 3 4 5 6 void test1() { char string[10]; char* str1 = "0123456789"; s ...
- 通过plsql develop查看建表语句
右键--查看 右下角 如下显示,找出ddl语句 可以看到索引等
- MySQL 遇到错误集锦
MySQL 规定:varchar必须指定长度,否则报错:ERROR 1064 (42000) 只有一列时,primary key 直接写在这一列的后面: 没有定义主键时,提示错误:ERROR 1075 ...
- vue监听路由变化
使用 watch,观察路由,一旦发生变化便重新获取数据 watch: { // 如果路由有变化,会再次执行该方法 '$route': 'fetchData' }