Java 泛型通配符上限和通配符下限
下面来分别讲一下
③.1<? extends T> 上限通配
这里?表示一个未知的类,而T是一个具体的类,在实际使用的时候T需要替换成一个具体的类,表示实例化的时候泛型参数要是T的子类
举个例子
我们有一个水果类
/**
* 水果类
*/
public abstract class Fruit {
public abstract void eat();
}
然后创建两种水果继承水果类Fruit
/**
* 苹果类
*/
public class Apple extends Fruit {
@Override
public void eat() {
System.out.println("我是苹果,我是酸酸甜甜的");
}
}
/**
* 香蕉类
*/
public class Banana extends Fruit {
@Override
public void eat() {
System.out.println("我是香蕉,我是软软的");
}
}
我们还需要一个吃瓜群众
/**
* 吃瓜群众
*/
public class People<T extends Fruit> {
public void eatFruit(T t){
t.eat();
}
}
请注意定义People类的时候我们使用了泛型上限表示<T extends Fruit>
我们创建一个类测试一下
public class Test {
public static void main(String[] args) {
People<Apple> p1 = new People<>();
p1.eatFruit(new Apple());
People<Banana> p2 = new People<>();
p2.eatFruit(new Banana());
}
}

若此时我们创建一个橙子类,但不继承自Fruit父类
/**
* 橙子类
*/
public class Orange {
public void eat() {
System.out.println("我是橙子,我是酸酸的");
}
}
编译时期就会报错,提示Orange不在范围内,应该要继承Fruit类
编译报错

③.2<? extends T> 上限通配
表示只能接收Number这个类以及这个类的子类的数据类型。(extends表继承,就是这个类下面的东西)再举个例子如下
public static void function(Student<? extends Number> s){
System.out.println("姓名是:"+s.getName());
}
④.1<? super T> 下限通配
这里?表示一个未知的类,而T是一个具体的类,在实际使用的时候T需要替换成一个具体的类,表示实例化的时候泛型参数要是T的父类。
例如
public static void addNumbers(List<? super Integer> list) {
for (int i = 1; i <= 10; i++) {
list.add(i);
}
}
这里表示我们调用这个方法时可以传入参数是Integer或者Integer的父类,例如:
public class TestLowerBounded {
public static void addNumbers(List<? super Integer> list) {
for (int i = 1; i <= 10; i++) {
list.add(i);
}
}
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>();
addNumbers(list1);
List<Number> list2 = new ArrayList<>();
addNumbers(list2);
List<Object> list3 = new ArrayList<>();
addNumbers(list3);
List<String> list4 = new ArrayList<>();
//编译错误,因为String不是Integer的父类
//addNumbers(list4);
}
}
Number和Object都是Integer的父类,所以编译通过,而String不是Integer的父类,编译报错。
④.2<? super T> 下限通配
表示只能接收Number这个类以及这个类的父类的数据类型。(super表父类,超过这个类的东西)再举个例子如下
public static void function(Student<? super Number> s){
System.out.println("姓名是:"+s.getName());
}
以上就是泛型上限通配符和下限通配符的作用了,知识点比较小,希望可以一点一点积累,和大家一起进步。
Java 泛型通配符上限和通配符下限的更多相关文章
- JAVA泛型之<? extends T>:(通配符上限)和<? super T>(通配符下限)
一.通配符上限和通配符下限接受的类型 通配符上限:<? extends T> 通配符下限:<? super T> 以下代码是测试结果,注释为解释说明 package xayd. ...
- Java泛型解析(02):通配符限定
Java泛型解析(02):通配符限定 考虑一个这种场景.计算数组中的最大元素. [code01] public class ArrayUtil { public static <T&g ...
- java 泛型的上限与下限
设置泛型对象的上限使用extends,表示参数类型只能是该类型或该类型的子类: 声明对象:类名<? extends 类> 对象名 定义类:类名<泛型标签 extends 类>{ ...
- Java泛型之上、下界通配符的理解(适合初学)
泛型的由来 为什么需要泛型 Java的数据类型一般都是在定义时就需要确定,这种强制的好处就是类型安全,不会出现像弄一个ClassCastException的数据给jvm,数据安全那么执行的clas ...
- Java泛型学习笔记 - (七)浅析泛型中通配符的使用
一.基本概念:在学习Java泛型的过程中, 通配符是较难理解的一部分. 主要有以下三类:1. 无边界的通配符(Unbounded Wildcards), 就是<?>, 比如List< ...
- Java泛型及实践
代码及说明: package com.zsm.crazyjava; import java.util.ArrayList; import java.util.Collection; import ja ...
- Java泛型解析(03):虚拟机运行泛型代码
Java泛型解析(03):虚拟机运行泛型代码 Java虚拟机是不存在泛型类型对象的,全部的对象都属于普通类,甚至在泛型实现的早起版本号中,可以将使用泛型的程序编译为在1.0虚拟机上可以执行的 ...
- java 泛型基础问题汇总
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引 ...
- Java泛型解析(04):约束和局限性
Java泛型解析(04):约束和局限性 前两节.认识和学习了泛型的限定以及通配符.刚開始学习的人可能须要一些时间去体会到泛型程序设计的优点和力量,特别是想成为库程序猿的同学就须要下 ...
随机推荐
- MySQL性能优化(一)-- 存储引擎和三范式
一.MySQL存储引擎 存储引擎说白了就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存 ...
- linux--GCC用法
1简介 2简单编译 2.1预处理 2.2编译为汇编代码(Compilation) 2.3汇编(Assembly) 2.4连接(Linking) 3多个程序文件的编译 4检错 5库文件连接 5.1编译成 ...
- 使用area标签实现标签的嵌套
在项目中我们会碰到这种需求:即点击这个整个a标签跳转到一个页面,点击a里面的某个a再跳转到另一个页面.有人会说,这还不简单,直接a标签嵌套a标签,可是事实如此吗,看代码: <a href=&qu ...
- C++说明符和限定符
有些被称为存储说明符(storage class specifier)或cv-限定符(cv-qualifier)的C++关键字提供了一些有关存储的信息.下面是存储所说明符:* auto (在C++11 ...
- u盘装系统,u盘安装win7系统教程
http://www.upanboot.com/tool/anzhuang_win7.html 可以用本教程给笔记本.台式机.上网本和组装电脑通过U盘安装Win7系统. 步骤一.首先要准备一个至少8G ...
- 安装postgresql之后为什么找不到postgresql service
没有正常启动 postgresql service.可以 在运行里面 输入 services.msc 找到 postgresql 的服务.启动他.或者也可以用postgres 自带的 工具pg_ctl ...
- BNU4206:单向行走
给定一个m*n的矩阵,请写一个程序计算一条从左到右走过矩阵且权和最小的路径.一条路径可以从第1列的任意位置出发,到达第n列的任意位置.每一步只能从第i列走到第i+1列的同一行或者相邻行(第一行和最后一 ...
- Android DatepickerDialog(日期选择器)的使用
效果图如下: 日期和时间选择对话框,首先是要获得当前时间,这里用 java类中的Calendar来获得日期和时间(也可以用Date,但是不提倡,Date部分方法已经注释为过时), Calendar是一 ...
- Spring----学习参考博客书单链接
[References] 1.IOC之基于Java类的配置Bean 2.IOC之基于注解的配置bean(上) 3.Spring之IOC的注入方式总结 4.Spring之IOC自动装配解析 5.Spri ...
- rest_framework之序列化详解 06
拿到所有的角色数据 1.urls.py 2.models.py 假设只有3个角色 3.views.py from api import models import json json只能序列化pyt ...