美文网首页
关于泛型类型通配符的小知识点

关于泛型类型通配符的小知识点

作者: Dandelion637 | 来源:发表于2018-06-04 18:47 被阅读36次
  • 对于类型通配符
import java.util.ArrayList;
import java.util.List;

class Fruit{}
class Apple extends Fruit{}
class Orange extends Fruit{}

public class Main {
  public static void main(String[] args) {
    List<? extends Fruit> fruits;
    List<Apple> apples = new ArrayList<>();
    List<Orange> oranges = new ArrayList<>();
    apples.add(new Apple());

    oranges.add(new Apple());       //编译错误
    fruits = oranges;

      /*这和上一个注释掉的语句作用相同,因此这里List<? extends Fruit> fruits不能添加Apple对象*/
    fruits.add(new Apple());          //编译错误
      
      /*这和上上一个注释掉的语句作用相同,因此这里List<? extends Fruit> fruits甚至不能添加Object对象*/
    fruits.add((Object)new Apple());      //编译错误
      
      /*任何参数里涉及泛型的函数由于安全问题都无法正常使用,get方法没有泛型,返回时Object,因此可以正常使用*/
    fruits.get(1);      
  }
}

对于`List<? extends Fruit> fruits,应当将其解读为

具有任何从Fruit继承的类型的列表

而不应该是

这个List将持有任何类型的Fruit

  • 对于超类型通配符
import java.util.ArrayList;
import java.util.List;

class Fruit{}
class Apple extends Fruit{}
class Orange extends Fruit{}
class Jonathan extends Apple{}

public class Main2 {

  public static void main(String[] args) {
    
    List<? super Apple> fruits;
    List<Apple> apples = new ArrayList<Apple>();
    fruits = apples;
    
    /*fruits 的基类是Apple,因此可以添加任何Apple类型及其子类,无法添加Object */
    fruits.add(new Apple());
    fruits.add(new Jonathan());
    list1.add(new Object());    //编译错误
    
    /*get函数正常,原理相同*/
    fruits.get(1);
  }
}


  • 总结

    出于类型安全考虑

    • 对于List<? extends Apple> apple,不能使用add()方法添加任何对象
    • 对于List<? super Apple> apples,可以使用add()方法添加Apple对象及其子类对象

参考资料:Java编程思想 P390-P393

如有错误还请指正

相关文章

  • Java基础

    1、泛型 jdk1.5增加了泛型支持很大程度是为了让集合记住其元素的类型。知识点:泛型类、泛型接口、类型通配符、泛...

  • java基础知识梳理&泛型初探

    目录 概述 范型的使用 类型参数 类型通配符 泛型方法 泛型类 限定类型参数上限 上界通配符(Upper Boun...

  • 详解Java泛型之4——一个例子理解泛型带来的好处

    前面我介绍了关于泛型、通配符以及泛型擦除的相关知识点,大家可以参考以下文章: 详解Java泛型之1——入门泛型必懂...

  • 关于泛型类型通配符的小知识点

    对于类型通配符 对于`List fruits,应当将其解读为 具有任何从Frui...

  • JAVA 泛型 边界 通配符

    泛型类 带有边界符的泛型方法 通配符,只读通配符,list 只接收T类型的子类或者T类型本身作为参数 只写通配符

  • 泛型程序设计---通配符类型

    1.通配符概念  通配符类型中,允许类型参数变化。例如,通配符类型  表示任何泛型类型Pair类型,它的类型参数是...

  • Java泛型食用笔记(四) -- 通配符

    Java泛型食用笔记(四) -- 通配符 1. 三种通配符 通配符为一个泛型类所指定的类型集合提供了一个有用的类型...

  • JAVA泛型总结

    泛型命名 泛型一些约定俗成的命名: 上界通配符 可以使用上界通配符来缩小类型参数的类型范围。 下界通配符 下界通配...

  • Java 泛型通配符上下界理解及应用

    一.通配符的应用 实践检验真理,所以在说明通配符上下界的理解的时候,先说明下什么时候使用通配符 关于泛型类型通配符...

  • 易错点

    泛型 泛型约束使用extends而非implements 泛型类型没有多态的说法,所以出现了?通配符 泛型方法必须...

网友评论

      本文标题:关于泛型类型通配符的小知识点

      本文链接:https://www.haomeiwen.com/subject/krwysftx.html