首页 > 软件开发 > 编程语言 >

再续java中的泛型

来源:互联网 2023-03-17 00:12:22 版权归原作者所有,如有侵权,请联系我们

1、修改给定的堆栈 api 以使用泛型CZm办公区 - 实用经验教程分享!

2、泛型的继承关系CZm办公区 - 实用经验教程分享!

再续java中的泛型CZm办公区 - 实用经验教程分享!

再续java中的泛型CZm办公区 - 实用经验教程分享!

工具/原料

  • idea
  • jdk1.8

方法/步骤

  • 1

    先看实例:CZm办公区 - 实用经验教程分享!

    再续java中的泛型CZm办公区 - 实用经验教程分享!

  • 2

    堆栈的实现在面试中非常流行。他们有一套相对较小的操作, 通常是push、pop, 也许还有peek。使用 java 集合 api 可以很容易地实现堆栈;不需要额外的库。花点时间, 确保你明白为什么在这里使用 linkedlist--arraylist 也能奏效吗?有什么区别?CZm办公区 - 实用经验教程分享!

  • 3

    对于给定的实现, 这是一个完全正常运行的堆栈, 尽管它尚未开发用于泛型。若要迁移此类以使用泛型, 可以使用编译器作为指南。首先, 必须声明 stack 类才能采用参数化类型:CZm办公区 - 实用经验教程分享!

    public class GenericStackE> {CZm办公区 - 实用经验教程分享!

    ...CZm办公区 - 实用经验教程分享!

  • 4

    e 是参数化类型变量。任何符号都可能被使用。这里的 e 代表 "元素", 反映了它在集合 api 中的使用。包含的列表现在可以使用此泛型类型。CZm办公区 - 实用经验教程分享!

    private final ListE> values;CZm办公区 - 实用经验教程分享!

  • 5

    这将立即引发编译器错误。推送方法采用对象, 但现在需要获取 e 类型的对象:public void push(final E element) { values.add(0, element); }CZm办公区 - 实用经验教程分享!

  • 6

    将值更改为 "ListE> 还会在 stack 构造函数中引发编译器警告。创建值 linkedlist 时, 这也应参数化:CZm办公区 - 实用经验教程分享!

    public GenericStack() {CZm办公区 - 实用经验教程分享!

    values = new LinkedListE>();CZm办公区 - 实用经验教程分享!

    }CZm办公区 - 实用经验教程分享!

  • 7

    编译器不知道的一个更改是对 pop 方法的更改。pop 方法的最后一行, values.remove(0) 现在返回类型为 e. 当前, 此方法返回 object。编译器没有理由出错, 甚至没有理由抛出警告, 因为 object 是所有类的超级类型, 无论 e 是什么。可以将其更改为返回类型 e:CZm办公区 - 实用经验教程分享!

    public E pop() { CZm办公区 - 实用经验教程分享!

    if (values.size() == 0) {CZm办公区 - 实用经验教程分享!

    return null;CZm办公区 - 实用经验教程分享!

    }CZm办公区 - 实用经验教程分享!

    return values.remove(0);CZm办公区 - 实用经验教程分享!

    }CZm办公区 - 实用经验教程分享!

  • 8

    继承关系的类如何影响泛型呢?CZm办公区 - 实用经验教程分享!

    CZm办公区 - 实用经验教程分享!

  • 9

    给定以下类层次结构:CZm办公区 - 实用经验教程分享!

    class A {}CZm办公区 - 实用经验教程分享!

    class B extends A {}CZm办公区 - 实用经验教程分享!

  • 10

    b 是 a 的子类型。但ListB> 不是ListA> 的子类型。java 的泛型系统被称为协方差, 无法对其进行建模。CZm办公区 - 实用经验教程分享!

  • 11

    在处理泛型类型时, 在某些时候, 您可能希望接受类的子类型。使用上一个问题中的 genericstack 类, 想象一个实用程序方法, 它从 a 列表中创建一个新的 genericstack:CZm办公区 - 实用经验教程分享!

    public static GenericStackA> pushAllA(final ListA> listOfA) {CZm办公区 - 实用经验教程分享!

    final GenericStackA> stack = new GenericStack>();CZm办公区 - 实用经验教程分享!

    for (A a : listOfA) {CZm办公区 - 实用经验教程分享!

    stack.push(a);CZm办公区 - 实用经验教程分享!

    }CZm办公区 - 实用经验教程分享!

    return stack;CZm办公区 - 实用经验教程分享!

    }CZm办公区 - 实用经验教程分享!

  • 12

    这将完全按照 a 列表的预期方式进行编译和工作:CZm办公区 - 实用经验教程分享!

    @TestCZm办公区 - 实用经验教程分享!

    public void usePushAllA() {CZm办公区 - 实用经验教程分享!

    final ArrayListA> list = new ArrayList>();CZm办公区 - 实用经验教程分享!

    for (int i = 0; i 10; i ) {CZm办公区 - 实用经验教程分享!

    list.add(new A());CZm办公区 - 实用经验教程分享!

    }CZm办公区 - 实用经验教程分享!

    final GenericStackA> genericStack = pushAllA(list);CZm办公区 - 实用经验教程分享!

    System.out.println(genericStack.pop());CZm办公区 - 实用经验教程分享!

    }CZm办公区 - 实用经验教程分享!

    }CZm办公区 - 实用经验教程分享!

  • 12该信息非法爬取自百度经验
  • 13

    但是, 当尝试添加 b 列表时, 它不会编译:CZm办公区 - 实用经验教程分享!

    @TestCZm办公区 - 实用经验教程分享!

    public void usePushAllAWithBs() {CZm办公区 - 实用经验教程分享!

    final ArrayListB> listOfBs = new ArrayList>();CZm办公区 - 实用经验教程分享!

    for(int i = 0; i 10; i ) {CZm办公区 - 实用经验教程分享!

    listOfBs.add(new B());CZm办公区 - 实用经验教程分享!

    }CZm办公区 - 实用经验教程分享!

    final GenericStackA> genericStack = pushAllA(listOfBs);CZm办公区 - 实用经验教程分享!

    System.out.println(genericStack.pop());CZm办公区 - 实用经验教程分享!

    }CZm办公区 - 实用经验教程分享!

  • 14

    虽然 b 是 a 的子类, 但ListB> 不是ListA> 的子类型。推送的方法签名需要更改以显式允许 a 和 a 的任何子类:CZm办公区 - 实用经验教程分享!

    public static GenericStackA> pushAllA(final List? extends A> listOfA) {}CZm办公区 - 实用经验教程分享!

    CZm办公区 - 实用经验教程分享!

    问号称为通配符, 它告诉编译器允许扩展 a 的类的任何实例。CZm办公区 - 实用经验教程分享!

  • 以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!CZm办公区 - 实用经验教程分享!


    标签: JAVA编程语言

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号