当前位置: 首页 > news >正文

Java泛型通配符extends与super

关键字说明

●  ? 通配符类型

●  <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类

●  <? super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object

extends 示例

    static class Food{}
static class Fruit extends Food{}
static class Apple extends Fruit{}
static class RedApple extends Apple{}

List<? extends Fruit> flist = new ArrayList<Apple>();
// complie error:
// flist.add(new Apple());
// flist.add(new Fruit());
// flist.add(new Object());
flist.add(null); // only work for null

List<? extends Frut> 表示 “具有任何从Fruit继承类型的列表”,编译器无法确定List所持有的类型,所以无法安全的向其中添加对象。可以添加null,因为null 可以表示任何类型。所以List 的add 方法不能添加任何有意义的元素,但是可以接受现有的子类型List<Apple> 赋值。

Fruit fruit = flist.get(0);

Apple apple = (Apple)flist.get(0);

由于,其中放置是从Fruit中继承的类型,所以可以安全地取出Fruit类型。

flist.contains(new Fruit());

flist.contains(new Apple());

在使用Collection中的contains 方法时,接受Object 参数类型,可以不涉及任何通配符,编译器也允许这么调用。

super 示例

List<? super Fruit> flist = new ArrayList<Fruit>();

flist.add(new Fruit());

flist.add(new Apple());

flist.add(new RedApple());

// compile error:

List<? super Fruit> flist = new ArrayList<Apple>();

List<? super Fruit> 表示“具有任何Fruit超类型的列表”,列表的类型至少是一个 Fruit 类型,因此可以安全的向其中添加Fruit 及其子类型。由于List<? super Fruit>中的类型可能是任何Fruit 的超类型,无法赋值为Fruit的子类型Apple的List<Apple>.

// compile error:

Fruit item = flist.get(0);

因为,List<? super Fruit>中的类型可能是任何Fruit 的超类型,所以编译器无法确定get返回的对象类型是Fruit,还是Fruit的父类Food 或 Object.

小结

extends 可用于的返回类型限定,不能用于参数类型限定。

super 可用于参数类型限定,不能用于返回类型限定。

带有super超类型限定的通配符可以向泛型对易用写入,带有extends子类型限定的通配符可以向泛型对象读取。——《Core Java》

转载于:https://www.cnblogs.com/sharewind/archive/2012/11/26/2788698.html

相关文章:

  • linux 自学系列:更改密码、获取帮助
  • HTML5之Canvas绘图——制作渐变式PPT背景
  • DOS命令大全
  • 关于JQuery的基础知识(一)
  • Tomcat启动成功 但是会报错
  • 如何配置yum源
  • 自动创建LAMP架构
  • 手动加密windows文件
  • C#基础知识整理 基础知识(19) 值类型的装箱和拆箱(二)
  • 在RHEL5上安装CouchDB
  • 你还敢用快递邮寄贵重物品吗?
  • 搬到CSDN,两个同时用,以防万一
  • 即时通讯开发
  • jquery 点击函数切换 toggle()
  • matplotlib 交互式导航
  • Apache的基本使用
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • css选择器
  • Java读取Properties文件的六种方法
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • python3 使用 asyncio 代替线程
  • SpringBoot几种定时任务的实现方式
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • - 概述 - 《设计模式(极简c++版)》
  • 简单实现一个textarea自适应高度
  • 聚类分析——Kmeans
  • 如何胜任知名企业的商业数据分析师?
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 用简单代码看卷积组块发展
  • 优秀架构师必须掌握的架构思维
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​Linux·i2c驱动架构​
  • #1014 : Trie树
  • #define 用法
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (论文阅读40-45)图像描述1
  • (算法)Game
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)C#调用WebService 基础
  • .htaccess 强制https 单独排除某个目录
  • .Net Core和.Net Standard直观理解
  • .NET业务框架的构建
  • .net中的Queue和Stack
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • /boot 内存空间不够
  • ??eclipse的安装配置问题!??
  • @NoArgsConstructor和@AllArgsConstructor,@Builder