Menu
CoddyTech

回顾:泛型容器

本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 58 课,共 87 课。

challenge icon

挑战

简单

让我们构建一个多功能存储系统,把你学过的泛型知识融会贯通!你将创建一个 Container 类,用来存储、获取和处理任意类型的元素,并添加实用方法来展示通配符的用法。

你将把代码分成三个文件:

  • Container.java:创建一个泛型类 Container<T> 来管理一组元素。容器应在内部使用 ArrayList<T> 存储元素。添加以下方法:add(T item) 用于添加元素,get(int index) 用于获取指定位置的元素,size() 用于返回元素数量,isEmpty() 用于检查容器是否为空。还要添加一个 getAll() 方法,用于返回内部列表。
  • ContainerUtils.java:创建一个实用类,其中包含适用于你的容器的静态泛型方法:

    printAll(Container<?> container) - 使用无界通配符打印任意容器中的所有元素,每行一个。

    countItems(Container<? extends Number> container) - 使用上界通配符计算容器中所有数值的总和,并以 double 类型返回结果。

    addDefaults(Container<? super Integer> container) - 使用下界通配符,向任何能够存储整数的容器中添加整数 1、2 和 3。

    <T> T getLastOrDefault(Container<T> container, T defaultValue) - 一个泛型方法,用于返回容器中的最后一个元素;如果容器为空,则返回默认值。

  • Main.java:整合你的泛型容器系统!你将接收三个输入:一个单词(String)、一个整数和一个 double。

    首先,创建一个 Container<String>,并将单词添加两次。打印 String container:,然后使用 printAll 显示其中的内容。

    接下来,创建一个 Container<Double>,并将 double 值添加进去。打印一个空行,然后使用 sumValues 打印 Number sum: [sum]。

    然后,创建一个 Container<Number> 并对它调用 addDefaults。打印一个空行,然后打印 After adding defaults:,并使用 printAll 显示其中的内容。

    最后,创建一个空的 Container<Integer>,并将输入的整数作为默认值传给 getLastOrDefault。打印一个空行,然后打印 Last or default: [result]。

你将按顺序接收三个输入:一个单词(String)、一个整数和一个 double。

这个挑战综合运用了泛型类、泛型方法、有界类型参数以及三种通配符。注意每一部分的不同作用:泛型类提供类型安全的存储,有界通配符让读取和写入更加灵活,而泛型方法则能在不同容器类型之间提供可复用的操作!

亲手试试

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 读取输入
        String word = scanner.nextLine();
        int intValue = Integer.parseInt(scanner.nextLine());
        double doubleValue = Double.parseDouble(scanner.nextLine());
        
        // TODO:创建一个 Container<String>,并将 word 添加两次
        // 先打印 "String container:",再使用 ContainerUtils.printAll()
        
        // TODO:创建一个 Container<Double>,并添加 double 值
        // 先打印一个空行,再使用 ContainerUtils.countItems() 打印 "Number sum: [sum]"
        
        // TODO:创建一个 Container<Number>,并对它调用 ContainerUtils.addDefaults()
        // 先打印一个空行,再打印 "After adding defaults:",然后使用 ContainerUtils.printAll()
        
        // TODO:创建一个空的 Container<Integer>
        // 以 intValue 为默认值,使用 ContainerUtils.getLastOrDefault()
        // 先打印一个空行,再打印 "Last or default: [result]"
    }
}

面向对象编程中的所有课

自己练习: Java 在线编译器