深入理解Java中的泛型(二)泛型的上界与下界

什么是泛型的上界与下界

上界

extends 关键字声明,表示参数化的类型可能是所指定的类或者其任意子类。例如<? extends Fruit> 泛型的上界就是 Fruit 类

//泛型的上界就是 Fruit 类
 ArrayList<? extends Fruit> fruitList = new ArrayList<Apple>();

下界

super 关键字声明,表示参数化的类型可能是所指定的类型或者其任意父类。例如<? super Apple>,泛型的下界就是 Apple 类。

//泛型的下界就是 Apple 类
List<? super Apple> appleList = new ArrayList<Fruit>();

泛型的上界与下界的限制

  • 上界的list只能get,不能add(确切地说不能add出除null之外的对象,包括Object)

  • 下界的list只能add,不能get

规定了上界:如果add添加对象,java不知道要为哪一个具体的类添加引用,但java不会自动选择;如果get对象,却可以(人为地)使用上界类创建引用了(因为代码中规定了上界,一看便知)。

规定了下界:如果add添加对象,java不知道要为哪一个具体的类添加引用,这里就可以(人为地)添加下界类的子类对象了(因为代码中规定了下界,一看便知);如果get对象,只能用预获取的类的‘同类’或父类创建引用,但程序员不知道get出来的是哪个类。

上界
下界

示例代码:

import java.util.ArrayList;
import java.util.List;
  
class Fruit {}
class Apple extends Fruit {}
class Jonathan extends Apple {}
class Orange extends Fruit {}
  
public class CovariantArrays {
  public static void main(String[] args) {
    //上界
    List<? extends Fruit> flistTop = new ArrayList<Apple>();
    flistTop.add(null);
    //add Fruit对象会报错
    //flist.add(new Fruit());
    Fruit fruit1 = flistTop.get(0);
  
    //下界
    List<? super Apple> flistBottem = new ArrayList<Apple>();
    flistBottem.add(new Apple());
    flistBottem.add(new Jonathan());
    //get Apple对象会报错
    //Apple apple = flistBottem.get(0);
  }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • ArrayList就是个泛型类,我们通过设定不同的类型,可以往集合里面存储不同类型的数据类型(而且只能存储设定的数...
    dinel阅读 3,395评论 0 2
  • 概述 泛型的本质是参数化类型,通常用于输入参数、存储类型不确定的场景。相比于直接使用 Object 的好处是:编译...
    彳亍口巴阅读 1,310评论 0 3
  • 本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://g...
    程序员黄小斜阅读 3,790评论 0 0
  • [TOC] 深入理解 Java 泛型 概述 泛型的本质是参数化类型,通常用于输入参数、存储类型不确定的场景。相比于...
    albon阅读 10,849评论 0 7
  • 📓 本文已归档到:「javacore」🔁 本文中的示例代码已归档到:「javacore」 1. 为什么需要泛型 J...
    静默虚空阅读 1,396评论 1 1

友情链接更多精彩内容