泛型

作者: battle_ | 来源:发表于2018-04-03 19:50 被阅读63次

    Fruit <- Apple
    Fruit <- Orange
    Fruit[] f = new Apple[10];
    f[0] = new Apple();
    f[1] = new Orange();

    以上编译阶段都不会报错。
    但是运行阶段数组new的是Apple,JVM就认为数组类型为Apple类型,所以添加其他的Fruit就会出现运行错误java.lang.ArrayStoreException

    泛型目的之一就是要在编译期让错误抛出,而不是等到运行期才知道错误。

    泛型通过限定通配符来限制数组类型
    List<? extends Fruit> f = Arrays.asList(new Apple());
    extends限定通配符不能使用add方法,也就是不能新增item,因为编译器只知道list内存的是fruit的子类型,不知道add的是Fruit的哪种子类型,所以就禁止使用add。但是可以使用get方法获取item的向上转型Fruit,Fruit就是该数组的上边界。
    List<? super Fruit> f
    super限定通配符不能使用get方法,可以使用add方法新增Fruit或其子类型,因为编译器只知道该list内类型为Fruit或其父类,可以使用add方法可以增加fruit及其子类型,因为在add过程中会向上转型成Fruit,而不能使用get方法,因为不知道get出的Obj到底是哪个子类型

    java泛型使用类型擦除方法,类型只存在编译期,运行时,并不知道类型存在。

    相关文章

      网友评论

          本文标题:泛型

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