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通配符的更多相关文章

  1. 廖雪峰Java4反射与泛型-3范型-5extends通配符

    1.泛型的继承关系: Pair<Integer>不是Pair<Number>的子类 add()不接受Pair<Integer> Pair.java package ...

  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. RESTful规范(一)

    一.学习restframework之前准备 1.json格式若想展示中文,需要ensure_ascii=False import json dic={'name':'你好'} print(json.d ...

  2. Blender 精确建模3D打印注意事项

    首先参照前面的<Blender的单位:一图弄懂Blender的单位>设置好自己环境的长度单位. 下面的注意事项,没有先后关系,遇到的就会补充. 1. 模型需要进行布尔计算前,在物件我是下, ...

  3. 【BZOJ3894】文理分科

    最小割劲啊 原题:  文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过)  小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位 ...

  4. 【mybatis源码学习】mybtias扩展点

    [1]org.apache.ibatis.reflection.ReflectorFactory 该扩展点,主要是对javaBean对象,进行反射操作. org.apache.ibatis.refle ...

  5. 你真的了解word-wrap和word-break的区别吗? (转载)

    这两个东西是什么,我相信至今还有很多人搞不清,只会死记硬背的写一个word-wrap:break-word;word-break:break-all;这样的东西来强制断句,又或者是因为这两个东西实在是 ...

  6. Cassandra基础2

    ========================================================= gossip协议1.点对点(peer to perr)的网络通信协议,节点间地位相同 ...

  7. Understanding how uid and gid work in Docker containers

    转自:https://medium.com/@mccode/understanding-how-uid-and-gid-work-in-docker-containers-c37a01d01cf Un ...

  8. Benchmarking Zeebe: An Intro to How Zeebe Scales Horizontally and How We Measure It

    Written by Felix Müller and Mike Winters on Jun 12 2018 in the Inside Zeebe category. In the past fe ...

  9. Jenkins发布后自动通知【钉钉】

    阅读目录 一.前言 二.使用钉钉推送的优势 三.配置 一.前言 最近使用Jenkins进行自动化部署,但是发布署后,并没有相应的通知,虽然有邮件发送通知,但是发现邮件会受限于大家接受的设置,导致不能及 ...

  10. 开发 FastAdmin 时见识到 php opcache 厉害

    开发 FastAdmin 时见识到 php opcache 厉害 FastAdmin 的插件配置是写在 config.php 中的. 我在修改配置时发现加了空格,然后再重新打开配置页发现空格没有配置面 ...